Board logo

标题: [日期时间] 批处理如何获取昨天/前一天的日期 [打印本页]

作者: ywjbycd    时间: 2014-9-1 11:15     标题: 批处理如何获取昨天/前一天的日期

本帖最后由 pcl_test 于 2017-6-7 10:42 编辑

@echo off
set dt=%date:~,10%
set de=%dt:~,8%
set dt=%dt:~-2%
set /a dt-=1

这是从网上找的一个取前一天时间的例子.但是到了今天没法使用了.因为今天是2014-09-01,前一天是2014-08-31.这个取完了是2014-09-0.
而且我把日期调整成2014-09-02 在看结果  是2014-09-1 少了一个0  正确的返回结果应该是2014-09-01.
求各路大神给个更好的例子.
作者: yu2n    时间: 2014-9-1 11:34

回复 1# ywjbycd

VBS 版(GetDateBefore.vbs):
  1. arrDate = Split(FormatDateTime(DateAdd("d", -1, Now()), vbShortDate), "-")
  2. If Len(arrDate(1)) = 1 Then arrDate(1) = "0" & arrDate(1)
  3. If Len(arrDate(2)) = 1 Then arrDate(2) = "0" & arrDate(2)
  4. WScript.Echo Join(arrDate, "-")
复制代码
BAT 版(GetDateBefore.bat):
  1. @echo off
  2. (echo,arrDate = Split^(FormatDateTime^(DateAdd^("d", -1, Now^(^)^), vbShortDate^), "-"^)
  3. echo,If Len^(arrDate^(1^)^) = 1 Then arrDate^(1^) = "0" ^& arrDate^(1^)
  4. echo,If Len^(arrDate^(2^)^) = 1 Then arrDate^(2^) = "0" ^& arrDate^(2^)
  5. echo,WScript.Echo Join^(arrDate, "-"^) ) > "%temp%\GetDateBefore.vbs"
  6. CScript //NoLogo "%temp%\GetDateBefore.vbs"
  7. pause
复制代码

作者: ywjbycd    时间: 2014-9-1 11:55

谢谢大神.测试成功.取值2014-01-01 也会返回 2013-12-31.
作者: ywjbycd    时间: 2014-9-1 11:57

但是大神,请问我echo那个会出现这个值呢?
就像我发的那个例子 我会echo %dt%
你发的这个 我要echo哪个呢?
作者: Batcher    时间: 2014-9-1 12:22

http://bbs.bathome.net/thread-3330-1-1.html
作者: yu2n    时间: 2014-9-1 13:12

回复 4# ywjbycd
CMD语句中,一般获取命令行程序的结果,使用 for /f 。
  1. @echo off
  2. (echo,arrDate = Split^(FormatDateTime^(DateAdd^("d", -1, Now^(^)^), vbShortDate^), "-"^)
  3. echo,If Len^(arrDate^(1^)^) = 1 Then arrDate^(1^) = "0" ^& arrDate^(1^)
  4. echo,If Len^(arrDate^(2^)^) = 1 Then arrDate^(2^) = "0" ^& arrDate^(2^)
  5. echo,WScript.Echo Join^(arrDate, "-"^)
  6. ) > "%temp%\GetDateBefore.vbs"
  7. for /f "tokens=1,* delims=??" %%i in ('CScript //NoLogo "%temp%\GetDateBefore.vbs"') Do (
  8.   set strDateBefore=%%i
  9. )
  10. echo,%strDateBefore%
  11. pause
复制代码

作者: ywjbycd    时间: 2014-9-1 13:17

嗯 好的.再次感谢各位大神的帮助.
作者: ljhtianlin    时间: 2014-9-5 16:01

运行不了。为什么会出现下标越界。。
作者: yu2n    时间: 2014-9-5 18:49

本帖最后由 yu2n 于 2014-9-5 18:56 编辑

回复 8# ljhtianlin
可能是日期格式问题,导致分隔符生成的数组越界。

这个里面有一个比较好的方法来解决这个问题。
http://bbs.bathome.net/thread-3330-1-1.html

另外,我也写了一个函数修正这个问题。效果如下:
  1. 今天日期:2014-09-05
  2. 距离今天 12 天之前的日期:2014-08-24
  3. 距离今天 16 天以后的日期:2014-09-21
  4. 距离日期 2012-12-25 的 12 天之前的日期:2012-12-13
  5. 距离日期 2012-12-25 的 16 天以后的日期:2013-01-10
  6. 请按任意键继续. . .
复制代码
代码:
  1. @echo off
  2. Call :_GET_DAY_ADD
  3. echo 今天日期:%DAY_ADD%
  4. echo.
  5. Call :_GET_DAY_ADD  -12
  6. echo 距离今天 12 天之前的日期:%DAY_ADD%
  7. echo.
  8. Call :_GET_DAY_ADD  +16
  9. echo 距离今天 16 天以后的日期:%DAY_ADD%
  10. echo.
  11. Call :_GET_DAY_ADD  -12  2012-12-25
  12. echo 距离日期 2012-12-25 的 12 天之前的日期:%DAY_ADD%
  13. echo.
  14. Call :_GET_DAY_ADD  +16  2012-12-25
  15. echo 距离日期 2012-12-25 的 16 天以后的日期:%DAY_ADD%
  16. echo.
  17. pause
  18. goto :eof
  19. :: 获取指定日期前
  20. goto :eof
  21. :_GET_DAY_ADD
  22.   (echo d1 = Now^(^)
  23.    echo d2 = d1
  24.    if not "%~2"=="" echo d1 = Replace^("%~2", ".", "-"^)
  25.    if not "%~1"=="" echo d2 = DateAdd^("d", Eval^("%~1"^), d1^)
  26.    echo d2 = Right^(Year^(d2^),4^) ^& "-" ^& Right^("0" ^& Month^(d2^),2^) ^& "-" ^& Right^("0" ^& Day^(d2^),2^)
  27.    echo WScript.Echo d2) > "%temp%\DayAdd.vbs"
  28.    for /f "tokens=1,* delims=??" %%i in ('CScript //NoLogo "%temp%\DayAdd.vbs"') Do (
  29.      set DAY_ADD=%%i
  30.    )
  31.    goto :eof
复制代码





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