[新手上路]批处理新手入门导读[视频教程]批处理基础视频教程[视频教程]VBS基础视频教程[批处理精品]批处理版照片整理器
[批处理精品]纯批处理备份&还原驱动[批处理精品]CMD命令50条不能说的秘密[在线下载]第三方命令行工具[在线帮助]VBScript / JScript 在线参考
返回列表 发帖

[数值计算] [已解决]批处理怎么使计算出来的日期规格化为yyyymmdd格式

  1. ::判断当前日期的前一天
  2. ::首先直接把天数减1天
  3. ::如果出来的是0天就把月减1天,天数是当月的最后一天。
  4. ::如果出来的是0月就把年减1年,月数是当年的最后一月。
  5. @echo off&setlocal enabledelayedexpansion
  6. set yyyy=%date:~0,4%
  7. set mm=%date:~5,2%
  8. set dd=%date:~8,2%
  9. set /a nd=!dd!-1
  10. ::如果象3月1日减一天是0天就...
  11. if !nd!==0 call :dd0
  12. if !mm!==0 call :mm0
  13. set yyyymmdd=!yyyy!-!mm!-!nd!
  14. echo 今天是:%date:~0,10%
  15. echo 昨天是:!yyyymmdd!
  16. pause
  17. :dd0
  18. set /a mm=!mm!-1
  19. for %%a in (1 3 5 7 8 10 12)do set %%add=31
  20. set /a pddd=!yyyy!*10/4
  21. set pd2d=!pddd:~-1,1!
  22. set 2dd=28
  23. if !pd2d!==0 set 2dd=29
  24. for %%b in (4 6 9 11)do set %%bdd=30
  25. set nd=!%mm%dd!
  26. goto :eof
  27. :mm0
  28. set /a yyyy=!yyyy!-1
  29. set mm=12
  30. set nd=31
  31. goto :eof
复制代码
这是网上的一个程序,是用来计算日期的,比如当前日期是2010-11-02日,它得出的前一天是2010-11-1日,如何使用它得到的前一天为2010-11-01日呢?
其实想借这段程序来计算日期,并为服务器每天定时自动备份mysql数据库,并自动删除指定天数前的备份目录,创建的日期是yyyymmdd格式,但计算的日期却是yyyymmd,这样就导致了小于10以下的日期无法自动删除
请求帮助。

[ 本帖最后由 xiaoyuwxz 于 2010-12-2 16:09 编辑 ]
1

评分人数

    • Batcher: 感谢给帖子标题标注[已解决]字样PB + 2

你给出的代码是错误的,因为没有对获取的月、日的字首0做处理,将导致set/a 运算出错以及定义变量出错。
call,33 这里的33是33天前的意思,可以根据需要修改
echo.%D% 获取并显示N天前的日期
  1. @echo off&setlocal enabledelayedexpansion
  2. call:D,33
  3. echo.%D%
  4. pause&exit
  5. :D
  6. for /f "tokens=1-3 delims=-:/ " %%a in ("%date%") do set Y=%%a&set M=%%b&set D=%%c
  7. if "%M:~0,1%"=="0" set M=%M:~1%
  8. if "%D:~0,1%"=="0" set D=%D:~1%
  9. set/a D-=%1
  10. if %D% gtr 0 goto:Y
  11. :M
  12. set/a M-=1
  13. if !M!==0 set/a Y-=1,M=12
  14. set/a "T=^!(M-2)","R=(^!(Y%%4)&^!^!(Y%%100))|^!(Y%%400)","C=^!(M-4)|^!(M-6)|^!(M-9)|^!(M-11)","D=T*(28+R)+C*30+(^!T&^!C)*31+D"
  15. if %D% leq 0 goto:M
  16. :Y
  17. set M=0%M%&set D=0%D%&set D=%Y%-!M:~-2!-!D:~-2!
复制代码

[ 本帖最后由 hanyeguxing 于 2010-11-29 23:09 编辑 ]
1

评分人数

寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

批处理获取指定天数之前的日期
http://bbs.bathome.net/thread-3330-1-1.html
我帮忙写的代码不需要付钱。如果一定要给,请在微信群或QQ群发给大家吧。
【微信公众号、微信群、QQ群】http://bbs.bathome.net/thread-3473-1-1.html
【支持批处理之家,加入VIP会员!】http://bbs.bathome.net/thread-67716-1-1.html

TOP

非常感谢 寒夜孤星,用你的代码可以了
原来的代码,我改成如下可以计算日期,就是日期未能规格化,用你给的代码搞定了,再次感谢,快速及高效率的回复。
  1. ::判断当前日期的前一天
  2. ::首先直接把天数减1天
  3. ::如果出来的是0天就把月减1天,天数是当月的最后一天。
  4. ::如果出来的是0月就把年减1年,月数是当年的最后一月。
  5. @echo off&setlocal enabledelayedexpansion
  6. set yyyy=%date:~0,4%
  7. set mm=%date:~5,2%
  8. set dd=%date:~8,2%
  9. set /a nd=!dd!-30
  10. ::如果象3月1日减一天是0天就...
  11. if !nd! lss 0 call :dd0
  12. if !mm!==0 call :mm0
  13. set yyyymmdd=!yyyy!-!mm!-!nd!
  14. echo 今天是:%date:~0,10%
  15. echo 30天前是:!yyyymmdd!
  16. pause
  17. :dd0
  18. set /a mm=!mm!-1
  19. for %%a in (1 3 5 7 8 10 12)do set %%add=31
  20. set /a pddd=!yyyy!*10/4
  21. set pd2d=!pddd:~-1,1!
  22. set 2dd=28
  23. if !pd2d!==0 set 2dd=29
  24. for %%b in (4 6 9 11)do set %%bdd=30
  25. set /a nd=!%mm%dd!+!nd!
  26. goto :eof
  27. :mm0
  28. set /a yyyy=!yyyy!-1
  29. set mm=12
  30. set nd=31
  31. goto :eof
复制代码

[ 本帖最后由 xiaoyuwxz 于 2010-11-30 00:07 编辑 ]

TOP

回复 4楼 的帖子

你把系统日期改成8月9日,你看你的代码还能正常吗?
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

谢谢,还真不行
我只会最简单的BAT,稍难点的就不会了,感谢你的帮助。
这个站的好多东西不错,学习

TOP

我也是初学者,看看我对楼主的代码进行的修改,应该符合了今天和昨天的要求,不过代码应该可以再精简一下,比如if换成for循环可能好点,但是我不太懂for,呵呵!

@echo off&setlocal enabledelayedexpansion
set yyyy=%date:~0,4%
set mm=%date:~5,2%
set dd=%date:~8,2%
set m1=%date:~5,1%
set d1=%date:~8,1%
set bb=0
if !m1!==0 set mm=%date:~6,1%
if !d1!==0 set dd=%date:~9,1%
set /a nd=!dd!-1
if !nd!==0 call :dd0
if !mm!==0 call :mm0

echo 今天是:%date:~0,10%
echo 昨天是:!yyyy!-!mm!-!nd!

if !mm!==1 set "mm=!bb!!mm!"
if !mm!==2 set "mm=!bb!!mm!"
if !mm!==3 set "mm=!bb!!mm!"
if !mm!==4 set "mm=!bb!!mm!"
if !mm!==5 set "mm=!bb!!mm!"
if !mm!==6 set "mm=!bb!!mm!"
if !mm!==7 set "mm=!bb!!mm!"
if !mm!==8 set "mm=!bb!!mm!"
if !mm!==9 set "mm=!bb!!mm!"
if !nd!==1 set "nd=!bb!!nd!"
if !nd!==2 set "nd=!bb!!nd!"
if !nd!==3 set "nd=!bb!!nd!"
if !nd!==4 set "nd=!bb!!nd!"
if !nd!==5 set "nd=!bb!!nd!"
if !nd!==6 set "nd=!bb!!nd!"
if !nd!==7 set "nd=!bb!!nd!"
if !nd!==8 set "nd=!bb!!nd!"
if !nd!==9 set "nd=!bb!!nd!"

echo 昨天是:!yyyy!-!mm!-!nd!

pause


:dd0
set /a mm=!mm!-1
for %%a in (1 3 5 7 8 10 12)do set %%add=31
set /a pddd=!yyyy!*10/4
set pd2d=!pddd:~-1,1!
set 2dd=28
if !pd2d!==0 set 2dd=29
for %%b in (4 6 9 11)do set %%bdd=30
set nd=!%mm%dd!
goto :eof
:mm0
set /a yyyy=!yyyy!-1
set mm=12
set nd=31
goto :eof

有什么问题请楼下的高手提出,相互学习学习!!!

TOP

我改成 if !mm!lss10 set "mm=!bb!!mm!"  为什么执行不了呢?显示“此时不应有 set  ” 我初学,不知道什么原因,请教高手解答,或者该怎么写???谢谢!!!

TOP

脚本要注意空格分隔!~
寒夜孤星:在没有说明的情况下,本人所有代码均运行在 XP SP3 下 (有问题请发贴,QQ临时会话已关闭)

TOP

谢谢寒夜孤星,我改成 if !mm! lss 10 set "mm=!bb!!mm!"  运行通过了,我语法还是不行,有待加强学习!!!谢谢

TOP

返回列表