Board logo

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

作者: 阿键    时间: 2013-4-7 17:23     标题: 批处理如何计算出当日/当天在本年内的第几周

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

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

可以参考下旧帖:
http://bbs.bathome.net/redirect. ... =7213&pid=46968
http://bbs.bathome.net/redirect. ... =7213&pid=46974
http://bbs.bathome.net/viewthread.php?tid=16147

虽然已经有了,但练手也无妨,也许还能写出更好的~
作者: 阿键    时间: 2013-4-8 11:10

谢谢,我先自己研究一下。
作者: terse    时间: 2013-4-8 15:40

修改下以前代码 不知满足否
  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%
复制代码

作者: foxJL    时间: 2013-4-8 21:15

  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
作者: terse    时间: 2013-4-9 01:17

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

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

都有现成的简短算法,所以应该没难度
作者: terse    时间: 2013-4-9 12:06

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

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

不是吧
假设 今天 1月2日 星期一 算法上应该是第二周吧
作者: Demon    时间: 2013-4-9 12:28

第一周的开始有不同的标准,你用的是哪种?
作者: terse    时间: 2013-4-9 12:43

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

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

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

作者: pcl_test    时间: 2016-8-9 18:05

  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
复制代码

作者: lingqing    时间: 2017-4-7 21:17

楼上正解啊
作者: happy886rr    时间: 2017-4-8 00:56

  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
复制代码

作者: ygqiang    时间: 2017-4-8 08:50

回复 14# happy886rr


    xp系统测试不行。
显示找不到操作数,0
作者: happy886rr    时间: 2017-4-8 08:54

回复 15# ygqiang
很正常,因为只兼容win7
作者: ShowCode    时间: 2017-4-9 10:55

回复 16# happy886rr


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




欢迎光临 批处理之家 (http://www.bathome.net/) Powered by Discuz! 7.2