[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[日期时间] 批处理如何计算出当日/当天在本年内的第几周

本帖最后由 pcl_test 于 2016-8-9 17:25 编辑

想写一个第几周的批处理,高手帮忙一下!
要求很简单:
1、以当日的时间算,计算出在本年内为第几周。
2、判断以某个条件相符后打印出信息。
主要是闰年可能要注意一下。

回复 16# happy886rr


    即使是Win7,由于系统日期格式不同,%DATE:/= %可能无法得到你想要的格式。

TOP

回复 15# ygqiang
很正常,因为只兼容win7

TOP

回复 14# happy886rr


    xp系统测试不行。
显示找不到操作数,0

TOP

  1. @echo off&setlocal enabledelayedexpansion
  2. set "DAYS=+00+31+28+31+30+31+30+31+31+30+31+30+31"
  3. for /f "tokens=1-4" %%a in ("%DATE:/= %") do (
  4. set YY=%%a
  5. set/a "M3=%%b*3
  6. set DD=%%c
  7. set WW=%%d
  8. )
  9. set/a "RES4=YY%%4, RES100=YY%%100, RES400=YY%%400, DSDAYS=!DAYS:~0,%M3%!+!DD!"
  10. if !RES4! equ 0 if !RES100! neq 0 (set/a DSDAYS+=1)
  11. if !RES400! equ 0 (set/a DSDAYS+=1)
  12. set/a "NWEEK=DSDAYS/7, RESDAY=DSDAYS-NWEEK*7"
  13. if !RESDAY! neq 0 (set/a NWEEK+=1)
  14. if !WW! neq 0 (set/a NWEEK+=1)
  15. echo !NWEEK!
  16. pause
复制代码

TOP

楼上正解啊

TOP

  1. powershell -c "$$=[System.Globalization.CultureInfo]::CurrentCulture;$$.Calendar.GetWeekOfYear($(Get-Date), $$.DateTimeFormat.CalendarWeekRule, $$.DateTimeFormat.FirstDayOfWeek)"
  2. pause
复制代码
  1. powershell -c "Get-Date -UFormat %%V"
  2. pause
复制代码
1

评分人数

TOP

  1. for /f %%a in ('mshta VBScript:Execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write DatePart(""ww"", date):close"^)') do echo;%%a
  2. pause
复制代码

TOP

本帖最后由 terse 于 2013-4-9 13:10 编辑
第一周的开始有不同的标准,你用的是哪种?
Demon 发表于 2013-4-9 12:28

每周从星期一开始 周末是星期日
假设 今天 1月2日 星期一 我在4楼代码算法是第二周的(我把一号算了上一周)
这里我并未以天算 当然也不知道楼主的意图 仅仅提供一个算法
不过如按照 Win32_LocalTime  类  WeekInMonth 算法 周日是一周的开始哦

TOP

第一周的开始有不同的标准,你用的是哪种?

TOP

我的想法是:
(今年1月1号到今天经过的天数 - ( 今天星期几 - 1 )) / 7

都有现成的简短算法,所以应该没难 ...
CrLf 发表于 2013-4-9 03:50

不是吧
假设 今天 1月2日 星期一 算法上应该是第二周吧

TOP

我的想法是:
(今年1月1号到今天经过的天数 - ( 今天星期几 - 1 )) / 7

都有现成的简短算法,所以应该没难度

TOP

首先声明下 4楼代码算法从简便考虑  只计算1901-2099年之间 故可排除闰年的一些问题
代码先计算出一年第一天”儒略日“ 这里的 “儒略日” 并否真正的 “儒略日” 而仅仅作为一个序数
再计算当天序数  由此计算出年内序数
另 年首天的星期算法我发现还是简便的 仅从年可得到
代码没完全测试 正确性尚不能确定

TOP

  1. @echo off
  2. setlocal enabledelayedexpansion
  3. for /f "skip=1 tokens=1,2,* delims= " %%i in ('"wmic path Win32_LocalTime get Month,Day,Year"') do (set/a year=%%k 2>nul
  4. set/a month=%%j 2>nul
  5. set/a day=%%i 2>nul)
  6. set /a mjd=((%day%-32075+1461*(%year%+4800+(%month%-14)/12)/4+367*(%month%-2-(%month%-14)/12*12)/12-3*((%year%+4900+(%month%-14)/12)/100)/4)-(1-32075+1461*(%year%+4800+(1-14)/12)/4+367*(1-2-(1-14)/12*12)/12-3*((%year%+4900+(1-14)/12)/100)/4)+1)
  7. set /a a=mjd/7,b=mjd%%7,c=a+1
  8. if "%b%"=="0" (echo 当前星期数为:%a%) else (echo 当前星期数为:%c%)
  9. pause
复制代码
:L:L:L:L:L
代码写出来才发现思路出了问题,我这个是按天数算的,没有考虑到星期会跨年。
代码本身没有问题哈,按“儒略日”算的,可以改成计算两个日期之间的相隔天数。:L

TOP

修改下以前代码 不知满足否
  1. @echo off
  2. for /f "skip=1 delims=" %%i in ('"wmic path Win32_LocalTime get Month,Day,Year"') do call:lp %%i Wk
  3. echo %Wk%
  4. pause&exit
  5. :lp
  6. setlocal enabledelayedexpansion
  7. set /a "y=%3,m=%2,d=%1,w=y-1,i=1461*w/4+429,w=(w+w/4-1)%%7+1"
  8. set /a "m=(m+9)%%12+4,y-=m/14"
  9. set /a "i=1461*y/4+153*m/5+d-i,i=(i-1+w)/7+1"
  10. endlocal&set %4=%i%
复制代码

TOP

返回列表