China DOS Union

-- Unite DOS · Advance DOS · Grow DOS --

Union site: www.cn-dos.net Forum site: www.cn-dos.net/forum
DOS stands for freedom, openness and progress. Let us work hard, learn from the openness and GNU spirit of FreeDOS and Linux, and together build and grow a free GNU GPL world!

中国DOS联盟论坛
The time now is 2026-06-30 17:21
中国DOS联盟论坛 » DOS批处理 & 脚本技术(批处理室) » [Original] Batch script to get the previous day's date View 3,162 Replies 10
Original Poster Posted 2008-01-17 10:57 ·  中国 北京 鹏博士BGP
新手上路
Credits 6
Posts 2
Joined 2008-01-17 10:22
18-year member
UID 108823
Gender Male
Status Offline
This is part of a bat I just wrote a few days ago. This is my first time writing a bat script. Those days I was often soaking in the union to learn bat knowledge, and I'm very grateful to the brothers in the union!

Since batch scripts are very widely used in automatic file uploading, getting the date of the previous day is a problem that is mostly encountered when completing this task, so I post the code here for newbies like me to refer to.

My method is a bit of a trick: if today is the 1st, then I need to handle the month (maybe the year), and then list the last day of the previous month. For example, October must definitely have 31 days, but February needs special handling. I need to calculate whether it's a leap year. The specific calculation method can be seen in my code. I'm sure this won't stump everyone. Finally, I just put the date together to get the date of the previous day.

I hope everyone has a better method and post the code to share it :)

::--------Generate Last Date----------
echo Generate last datetime...

set TodayYear=%date:~0,4%
set TodayMon=%date:~5,2%
set TodayDay=%date:~8,2%

set LastdayYear=
set LastdayMon=
set LastdayDay=

set LastdayYear=%TodayYear%
set LastdayMon=%TodayMon%
set /A LastdayDay=TodayDay-1

if "%LastdayDay%" == "0" (
if "!LastdayMon!" == "01" (
set LastdayMon=12
set /A LastdayYear-=1
) else (
set /A LastdayMon-=1

if "!LastdayMon!" == "1" set LastdayMon=01
if "!LastdayMon!" == "2" set LastdayMon=02
if "!LastdayMon!" == "3" set LastdayMon=03
if "!LastdayMon!" == "4" set LastdayMon=04
if "!LastdayMon!" == "5" set LastdayMon=05
if "!LastdayMon!" == "6" set LastdayMon=06
if "!LastdayMon!" == "7" set LastdayMon=07
if "!LastdayMon!" == "8" set LastdayMon=08
if "!LastdayMon!" == "9" set LastdayMon=09
)

if "!LastdayMon!" == "01" set LastdayDay=31
if "!LastdayMon!" == "03" set LastdayDay=31
if "!LastdayMon!" == "04" set LastdayDay=30
if "!LastdayMon!" == "05" set LastdayDay=31
if "!LastdayMon!" == "06" set LastdayDay=30
if "!LastdayMon!" == "07" set LastdayDay=31
if "!LastdayMon!" == "08" set LastdayDay=31
if "!LastdayMon!" == "09" set LastdayDay=30
if "!LastdayMon!" == "10" set LastdayDay=31
if "!LastdayMon!" == "11" set LastdayDay=30
if "!LastdayMon!" == "12" set LastdayDay=31

if "!LastdayMon!" == "02" (
set IsLeapYear=
set /A IsLeapYear=!LastdayYear!%%400
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear!%%100
if "!IsLeapYear!" == "0" (
set LastdayDay=28
goto MAKELASTDATE
)
set /A IsLeapYear=!LastdayYear%%4
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
) else (
set LastdayDay=28
goto MAKELASTDATE
)
)
)

:MAKELASTDATE

if "%LastdayDay%" == "1" set LastdayDay=01
if "%LastdayDay%" == "2" set LastdayDay=02
if "%LastdayDay%" == "3" set LastdayDay=03
if "%LastdayDay%" == "4" set LastdayDay=04
if "%LastdayDay%" == "5" set LastdayDay=05
if "%LastdayDay%" == "6" set LastdayDay=06
if "%LastdayDay%" == "7" set LastdayDay=07
if "%LastdayDay%" == "8" set LastdayDay=08
if "%LastdayDay%" == "9" set LastdayDay=09

set LastDate=%LastdayYear%.%LastdayMon%.%LastdayDay%

echo Generate last datetime OK!
Floor 2 Posted 2008-01-17 12:27 ·  中国 陕西 西安 电信
初级用户
Credits 34
Posts 17
Joined 2007-05-23 10:55
19-year member
UID 89042
Gender Male
Status Offline
Why not use for /l???
Floor 3 Posted 2008-01-17 13:06 ·  中国 北京 联通(数字北京大厦IDC机房)
中级用户
★★
Credits 321
Posts 135
Joined 2007-02-04 04:48
19-year member
UID 78578
Gender Male
Status Offline
Give a like, thanks for sharing.
Floor 4 Posted 2008-01-17 14:39 ·  中国 陕西 西安 电信
初级用户
Credits 34
Posts 17
Joined 2007-05-23 10:55
19-year member
UID 89042
Gender Male
Status Offline
I used FOR /L to modify it, just for my own practice~~~~ It should be more concise~~

::--------生成最后日期----------
echo 生成最后日期时间...

set TodayYear=%date:~0,4%
set TodayMon=%date:~5,2%
set TodayDay=%date:~8,2%

set LastdayYear=
set LastdayMon=
set LastdayDay=

set LastdayYear=%TodayYear%
set LastdayMon=%TodayMon%
set /A LastdayDay=TodayDay-1


if "%LastdayDay%" == "0" (
if "!LastdayMon!" == "01" (
set LastdayMon=12
set /A LastdayYear-=1
) else (
set /A LastdayMon-=1
for /l %%a in (1,1,9) do if !LastdayMon! == %%a (set LastdayMon=0%%a)
)



for /l %%a in (1,2,7) do (
if !LastdayMon! equ %%a (set set LastdayDay=31)
else
for /l %%a in (8,2,12) do if !LastdayMon! equ %%a (set set LastdayDay=31)
else
if "!LastdayMon!" == "02" (
set IsLeapYear=

set /A IsLeapYear=!LastdayYear!%%400
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)

set /A IsLeapYear=!LastdayYear!%%100
if "!IsLeapYear!" == "0" (
set LastdayDay=28
goto MAKELASTDATE
)

set /A IsLeapYear=!LastdayYear%%4
if "!IsLeapYear!" == "0" (
set LastdayDay=29
goto MAKELASTDATE
)
else (
set LastdayDay=28
goto MAKELASTDATE
)
)
else set LastdayDay=30
)
)

:MAKELASTDATE
for /l %%a in (1,1,9) do if %LastdayDay% == 1 (set LastdayDay=0%%a)

set LastDate=%LastdayYear%.%LastdayMon%.%LastdayDay%

echo 生成最后日期时间成功!
Floor 5 Posted 2008-01-17 15:14 ·  中国 重庆 电信
版主
★★★★★
Credits 9,023
Posts 5,017
Joined 2007-05-31 19:39
19-year member
UID 89899
Gender Male
Status Offline
Floor 6 Posted 2008-01-17 16:30 ·  中国 北京 鹏博士BGP
新手上路
Credits 6
Posts 2
Joined 2008-01-17 10:22
18-year member
UID 108823
Gender Male
Status Offline
Well, Brother daker, I have carefully read your code. It's indeed much more concise than mine. I didn't consider that using for /l could solve the problem of known - length strings at that time. Thanks a lot! I've also looked at Brother HAT's code. His code is more powerful in functionality, and the solutions 2 and 3 deal with it from the mathematical essence of dates, which feels much more professional. I think when I have time, I'll write a script calendar program, so that I can fundamentally solve the defects of the date function in bat. I wonder if someone has already done it? Well, closing the thread. Thanks to everyone again.
Floor 7 Posted 2008-03-06 12:03 ·  中国 四川 成都 电信
初级用户
★★
Credits 110
Posts 50
Joined 2008-01-18 15:02
18-year member
UID 108931
Gender Male
Status Offline
Then how to get the date of the previous day under WIN2000? These are all under XP environment.
Floor 8 Posted 2008-10-01 04:52 ·  中国 陕西 西安 电信
新手上路
Credits 4
Posts 2
Joined 2008-10-01 04:26
17-year member
UID 127134
Gender Male
Status Offline
You should add a line "setlocal enabledelayedexpansion" at the front of the batch file, which means enabling variable delay; otherwise, this program will not execute normally. I have tried it. Finally, thank you for sharing, which helped me solve the problem.
Floor 9 Posted 2008-10-01 04:54 ·  中国 陕西 西安 电信
新手上路
Credits 4
Posts 2
Joined 2008-10-01 04:26
17-year member
UID 127134
Gender Male
Status Offline
Only when variable delay is enabled can you use !! to enclose the variable name to represent the reference to the variable value.
Floor 10 Posted 2009-11-05 22:26 ·  中国 北京 联通
新手上路
Credits 7
Posts 4
Joined 2009-10-19 19:05
16-year member
UID 153344
Gender Male
Status Offline
If there is a database connection, you can take sysdate - 1 from the database, write it to a file, and then take out the date of the previous day from the file... The premise is that you can connect to the database, heh heh
Floor 11 Posted 2009-12-16 15:51 ·  中国 江西 南昌 电信
中级用户
★★
Credits 220
Posts 99
Joined 2005-08-16 01:08
20-year member
UID 41691
Status Offline
@echo off
echo Wscript.echo dateadd("d",-1,date)>vbs.vbs
for /f %%a in ('cscript //nologo vbs.vbs') do del vbs.vbs&&echo %%a
Forum Jump: