找回密码
 注册
搜索
[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
查看: 47324|回复: 8

[日期时间] 批处理如何获取昨天/前一天的日期

[复制链接]
发表于 2014-9-1 11:15:24 | 显示全部楼层 |阅读模式
本帖最后由 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.
求各路大神给个更好的例子.
发表于 2014-9-1 11:34:58 | 显示全部楼层
回复 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
复制代码
 楼主| 发表于 2014-9-1 11:55:16 | 显示全部楼层
谢谢大神.测试成功.取值2014-01-01 也会返回 2013-12-31.
 楼主| 发表于 2014-9-1 11:57:24 | 显示全部楼层
但是大神,请问我echo那个会出现这个值呢?
就像我发的那个例子 我会echo %dt%
你发的这个 我要echo哪个呢?
发表于 2014-9-1 12:22:44 | 显示全部楼层
发表于 2014-9-1 13:12:41 | 显示全部楼层
回复 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
复制代码
 楼主| 发表于 2014-9-1 13:17:06 | 显示全部楼层
嗯 好的.再次感谢各位大神的帮助.
发表于 2014-9-5 16:01:10 | 显示全部楼层
运行不了。为什么会出现下标越界。。
发表于 2014-9-5 18:49:38 | 显示全部楼层
本帖最后由 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
复制代码
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|批处理之家 ( 渝ICP备10000708号 )

GMT+8, 2026-3-19 01:18 , Processed in 0.019100 second(s), 8 queries , File On.

Powered by Discuz! X3.5

© 2001-2026 Discuz! Team.

快速回复 返回顶部 返回列表