Windows命令行如何用表达式替换硬编码日期并获取昨日日期
获取Windows命令行中昨日日期的方法
在Windows原生CMD环境里,确实没有像date.add(-1)这么直观的日期加减语法,但我们有两种可靠的方案来实现你的需求——一种简单省心,一种纯原生不依赖其他工具,下面分别说明:
方法一:借助PowerShell(推荐,高效可靠)
PowerShell支持直接调用.NET的日期处理API,能自动搞定闰年、月份切换(比如1月1日的昨日是去年12月31日)这些头疼的边界情况,语法也接近你想要的风格。
你可以在CMD里执行这条命令,把昨日日期存到变量里(格式和你当前用的%date:~10,4%-%date:~4,2%-%date:~7,2%完全一致,也就是YYYY-MM-DD):
for /f "delims=" %%a in ('powershell -Command "(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')"') do set YESTERDAY=%%a
执行后,直接用%YESTERDAY%就能引用昨日日期了。要是只想直接输出不存变量,直接跑这条就行:
powershell -Command "(Get-Date).AddDays(-1).ToString('yyyy-MM-dd')"
方法二:纯CMD脚本(无依赖,适合受限环境)
如果你的环境不能用PowerShell,那就得用纯CMD脚本自己处理日期逻辑,虽然代码复杂点,但能覆盖所有边界情况:
@echo off setlocal enabledelayedexpansion :: 提取当前日期的年、月、日(和你的现有格式匹配) set "YYYY=%date:~10,4%" set "MM=%date:~4,2%" set "DD=%date:~7,2%" :: 定义非闰年各月天数 set "days_in_month=31 28 31 30 31 30 31 31 30 31 30 31" :: 判断闰年,调整2月天数 set /a "mod4=YYYY%%4, mod100=YYYY%%100, mod400=YYYY%%400" if !mod4! equ 0 if !mod100! neq 0 set "days_in_month=31 29 31 30 31 30 31 31 30 31 30 31" if !mod400! equ 0 set "days_in_month=31 29 31 30 31 30 31 31 30 31 30 31" :: 计算昨日的日数 set /a "DD=DD-1" if !DD! lss 1 ( :: 日数不足,回退到上个月 set /a "MM=MM-1" if !MM! lss 1 ( :: 月份不足,回退到去年 set /a "YYYY=YYYY-1" set "MM=12" ) :: 获取上个月的天数 set "index=0" for %%d in (!days_in_month!) do ( set /a "index+=1" if !index! equ !MM! set "DD=%%d" ) ) :: 补前导零,确保月、日是两位数格式 if !MM! lss 10 set "MM=0!MM!" if !DD! lss 10 set "DD=0!DD!" :: 组合成目标格式的昨日日期 set "YESTERDAY=!YYYY!-!MM!-!DD!" echo !YESTERDAY! endlocal
把这段代码存成.bat文件运行,就能得到昨日日期,或者把YESTERDAY变量整合到你的现有脚本里。
重要提醒
你当前用的%date:~10,4%-%date:~4,2%-%date:~7,2%是依赖系统区域设置的——如果你的系统日期显示格式不是ddd MM/DD/YYYY(比如有些地区是YYYY/MM/DD),那%date%的截取位置就得调整。而PowerShell的方法不受区域设置影响,这也是更推荐它的原因。
内容的提问来源于stack exchange,提问作者Yoni
相关产品推荐
相关产品推荐

