批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程
[批处理文件精品]批处理版照片整理器[批处理文件精品]纯批处理备份&还原驱动在线第三方下载
返回列表 发帖

[日期时间] 批处理获取指定天数之前的日期(2016-06-13更新)

【方案一】BAT调用PowerShell
  1. @echo off
  2. ::Win7/Win8/Win10等系统自带PowerShell
  3. REM 指定天数
  4. set DaysAgo=1
  5. for /f %%i in ('powershell -c "Get-Date (Get-Date).AddDays(-%DaysAgo%) -uformat "%%Y-%%m-%%d""') do (
  6.     set "DstDate=%%i"
  7. )
  8. echo,%DstDate%
  9. pause
复制代码
【方案二】BAT调用VBS
  1. @echo off
  2. ::需要调用VBS
  3. REM 指定天数
  4. set DaysAgo=1
  5. >"%temp%\MyDate.vbs" echo LastDate=date()-%DaysAgo%
  6. >>"%temp%\MyDate.vbs" echo FmtDate=right(year(LastDate),4) ^& right("0" ^& month(LastDate),2) ^& right("0" ^& day(LastDate),2)
  7. >>"%temp%\MyDate.vbs" echo wscript.echo FmtDate
  8. for /f %%a in ('cscript /nologo "%temp%\MyDate.vbs"') do (
  9.     set DstDate=%%a
  10. )
  11. set DstDate=%DstDate:~0,4%-%DstDate:~4,2%-%DstDate:~6,2%
  12. echo %DaysAgo%天之前的日期是:%DstDate%
  13. pause
复制代码
【方案三】BAT调用gawk
  1. @echo off
  2. ::本例需要gawk.exe的支持(下载地址 http://code.google.com/p/gnu-on-windows/downloads/list)
  3. REM 指定天数
  4. set DaysAgo=1
  5. set ThisDate=2014-02-20
  6. echo %ThisDate% | gawk -F "-" -v days=%DaysAgo% "{$1=$1;print strftime(\"%%F\",mktime($0\" 0 0 0\")-86400*days)}"
  7. pause
复制代码
【方案四】BAT调用日期时间函数
  1. @echo off
  2. ::本例需要reg.exe的支持(XP系统自带)
  3. ::此类方法的关键在于如何获取标准化的当前系统日期
  4. ::请参考http://bbs.bathome.cn/thread-3328-1-1.html
  5. ::然后调用 Ritchie Lawrence 的日期函数,便可扩展出很多种方法,此处不再赘述。
  6. ::日期转换的核心算法请参考http://bbs.bathome.cn/thread-3056-1-1.html
  7. REM 指定天数
  8. set DaysAgo=1
  9. for /f "skip=4 delims= " %%a in ('reg query "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate') do (
  10.     set RegDateOld=%%a
  11. )
  12. set RegDateOld=%RegDateOld:~-8%
  13. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d yyyy-M-d /f>nul
  14. call :DateToDays %date:~0,4% %date:~5,2% %date:~8,2% PassDays
  15. reg add "HKEY_CURRENT_USER\Control Panel\International" /v sShortDate /t REG_SZ /d %RegDateOld% /f>nul
  16. set /a PassDays-=%DaysAgo%
  17. call :DaysToDate %PassDays% DstYear DstMonth DstDay
  18. set DstDate=%DstYear%-%DstMonth%-%DstDay%
  19. echo %DaysAgo%天之前的日期是:%DstDate%
  20. pause
  21. goto :eof
  22. :DateToDays %yy% %mm% %dd% days
  23. setlocal ENABLEEXTENSIONS
  24. set yy=%1&set mm=%2&set dd=%3
  25. if 1%yy% LSS 200 if 1%yy% LSS 170 (set yy=20%yy%) else (set yy=19%yy%)
  26. set /a dd=100%dd%%%100,mm=100%mm%%%100
  27. set /a z=14-mm,z/=12,y=yy+4800-z,m=mm+12*z-3,j=153*m+2
  28. set /a j=j/5+dd+y*365+y/4-y/100+y/400-2472633
  29. endlocal&set %4=%j%&goto :EOF
  30. :DaysToDate %days% yy mm dd
  31. setlocal ENABLEEXTENSIONS
  32. set /a a=%1+2472632,b=4*a+3,b/=146097,c=-b*146097,c/=4,c+=a
  33. set /a d=4*c+3,d/=1461,e=-1461*d,e/=4,e+=c,m=5*e+2,m/=153,dd=153*m+2,dd/=5
  34. set /a dd=-dd+e+1,mm=-m/10,mm*=12,mm+=m+3,yy=b*100+d-4800+m/10
  35. (if %mm% LSS 10 set mm=0%mm%)&(if %dd% LSS 10 set dd=0%dd%)
  36. endlocal&set %2=%yy%&set %3=%mm%&set %4=%dd%&goto :EOF
复制代码
【批处理在线视频分享】http://bbs.bathome.net/thread-31727-1-1.html
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html

我帮忙写的代码不需要付钱,不用找我要支付宝或微信账号。如果一定要给,请到微信群给大家发红吧。

所以还是函数库强大。。。

TOP

不行,我水平太差了,要看懂这些有点困难,先去学习别的了,过阵子再来看

TOP

本帖最后由 yu2n 于 2014-12-11 10:11 编辑

PK第一个方案BAT+VBS版本……
  1. @echo off
  2. call :_DateAdd  2014.12.30  -5
  3. echo, 2014.12.30  5天前是 %dt%
  4. call :_DateAdd  2014-12-30  +5
  5. echo, 2014-12-30  5天后是 %dt%
  6. call :_DateAdd  2014/12/30  +500
  7. echo, 2014/12/30  500天后是 %dt%
  8. pause
  9. ' 返回日期(修正系统日期分隔符不同的问题) By Yu2n 2014.12.10
  10. ' 参数1日期,参数2为加减天数
  11. Goto :Eof
  12. :_DateAdd
  13.   (echo, If IsDate^("%~1"^) Then
  14.   echo,   dt=CDate^("%~1"^)
  15.   echo, Else
  16.   echo,   For Each s1 In Split^(". - /"^)
  17.   echo,     For Each s2 In Split^(". - /"^)
  18.   echo,       If IsDate^(Replace^("%~1",s1,s2^)^) Then dt=CDate^(Replace^("%~1",s1,s2^)^)
  19.   echo,     Next
  20.   echo,   Next
  21.   echo, End If
  22.   echo, dt = DateAdd^("d", Eval^("%~2"^), dt^)
  23.   echo, WScript.Echo Right^(Year^(dt^),4^) ^& "-" ^& Right^("0" ^& Month^(dt^),2^) ^& "-" ^& Right^("0" ^& Day^(dt^),2^))>"%tmp%\_DateAdd.vbs"
  24.   for /f "delims=" %%i in ('CScript //NoLogo "%tmp%\_DateAdd.vbs"') do set dt=%%i
  25.   goto :Eof
复制代码
结果:
  1. 2014.12.30  5天前是 2014-12-25
  2. 2014-12-30  5天后是 2015-01-04
  3. 2014/12/30  500天后是 2016-05-13
  4. 请按任意键继续. . .
复制代码
另外,再发一个VBS版……
  1. d1 = "2014.03.01"
  2. nAdd = "-3"
  3. d2 = DateAdd("d", Eval(nAdd), GetDate(d1))
  4. d2 = Right(Year(d2),4) & "-" & Right("0" & Month(d2),2) & "-" & Right("0" & Day(d2),2)
  5. WScript.Echo d2
  6. ' 返回日期(修正系统日期分隔符不同的问题) By Yu2n 2014.12.10
  7. Function GetDate(ByVal strDate)
  8.     If IsDate(strDate) Then GetDate = CDate(strDate) :  Exit Function
  9.     Dim s1, s2
  10.     For Each s1 In Split(". - /")
  11.         For Each s2 In Split(". - /")
  12.             If IsDate(Replace(strDate,s1,s2)) Then GetDate=CDate(Replace(strDate,s1,s2)) : Exit Function
  13.         Next
  14.     Next
  15. End Function
复制代码
『千江有水千江月』千江有水,月映千江;万里无云,万里青天。    http://yu2n.qiniudn.com/

TOP

返回列表