标题: [日期时间] 批处理如何计算出当日/当天在本年内的第几周 [打印本页]
作者: 阿键 时间: 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
修改下以前代码 不知满足否- @echo off
- for /f "skip=1 delims=" %%i in ('"wmic path Win32_LocalTime get Month,Day,Year"') do call:lp %%i Wk
- echo %Wk%
- pause&exit
- :lp
- setlocal enabledelayedexpansion
- set /a "y=%3,m=%2,d=%1,w=y-1,i=1461*w/4+429,w=(w+w/4-1)%%7+1"
- set /a "m=(m+9)%%12+4,y-=m/14"
- set /a "i=1461*y/4+153*m/5+d-i,i=(i-1+w)/7+1"
- endlocal&set %4=%i%
复制代码
作者: foxJL 时间: 2013-4-8 21:15
- @echo off
- setlocal enabledelayedexpansion
- 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
- set/a month=%%j 2>nul
- set/a day=%%i 2>nul)
- 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)
- set /a a=mjd/7,b=mjd%%7,c=a+1
- if "%b%"=="0" (echo 当前星期数为:%a%) else (echo 当前星期数为:%c%)
- 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
- for /f %%a in ('mshta VBScript:Execute("CreateObject(""Scripting.FileSystemObject"").GetStandardStream(1).Write DatePart(""ww"", date):close"^)') do echo;%%a
- pause
复制代码
作者: pcl_test 时间: 2016-8-9 18:05
- powershell -c "$$=[System.Globalization.CultureInfo]::CurrentCulture;$$.Calendar.GetWeekOfYear($(Get-Date), $$.DateTimeFormat.CalendarWeekRule, $$.DateTimeFormat.FirstDayOfWeek)"
- pause
复制代码
- powershell -c "Get-Date -UFormat %%V"
- pause
复制代码
作者: lingqing 时间: 2017-4-7 21:17
楼上正解啊
作者: happy886rr 时间: 2017-4-8 00:56
- @echo off&setlocal enabledelayedexpansion
- set "DAYS=+00+31+28+31+30+31+30+31+31+30+31+30+31"
-
- for /f "tokens=1-4" %%a in ("%DATE:/= %") do (
- set YY=%%a
- set/a "M3=%%b*3
- set DD=%%c
- set WW=%%d
- )
- set/a "RES4=YY%%4, RES100=YY%%100, RES400=YY%%400, DSDAYS=!DAYS:~0,%M3%!+!DD!"
-
- if !RES4! equ 0 if !RES100! neq 0 (set/a DSDAYS+=1)
- if !RES400! equ 0 (set/a DSDAYS+=1)
-
- set/a "NWEEK=DSDAYS/7, RESDAY=DSDAYS-NWEEK*7"
- if !RESDAY! neq 0 (set/a NWEEK+=1)
- if !WW! neq 0 (set/a NWEEK+=1)
- echo !NWEEK!
- 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://bbs.bathome.net/) |
Powered by Discuz! 7.2 |