如何在批处理脚本中获取yyyymmdd格式的前一天日期
嘿,要在批处理里拿到前一天的yyyymmdd格式日期确实有点麻烦——毕竟原生批处理没自带日期计算的功能,不过我给你准备了两个实用的方案,看你需求选就行:
方案1:借助PowerShell实现(首推,省心又靠谱)
现在几乎所有Windows系统都自带PowerShell,用它来做日期计算简直是降维打击,完全不用操心闰年、月份天数这些坑。直接把PowerShell的计算结果捕获到批处理变量里就行,代码如下:
@echo off setlocal enabledelayedexpansion :: 调用PowerShell获取前一天的yyyymmdd格式日期 for /f %%a in ('powershell -Command "(Get-Date).AddDays(-1).ToString('yyyyMMdd')"') do set YESTERDAY=%%a echo 前一天日期:!YESTERDAY! endlocal
简单解释下:
(Get-Date).AddDays(-1):获取当前日期并减去1天ToString('yyyyMMdd'):把日期格式转换成你要的yyyymmdd样式for /f:把PowerShell输出的结果抓取到批处理的YESTERDAY变量里
方案2:纯批处理原生实现(无外部依赖)
如果你的环境不能用PowerShell,那只能用纯批处理硬写逻辑了——这时候得自己处理闰年判断、不同月份的天数问题,下面是经过验证的脚本,和你原有的日期获取逻辑兼容:
@echo off setlocal enabledelayedexpansion :: 先拆分当前日期的年、月、日(和你原代码的截取逻辑一致) set "YYYY=%DATE:~10,4%" set "MM=%DATE:~4,2%" set "DD=%DATE:~7,2%" :: 先给日期减1 set /a DD=%DD%-1 if !DD! lss 1 ( :: 日期减到0了,得往前推一个月 set /a MM=%MM%-1 if !MM! lss 1 ( :: 月份减到0了,得往前推一年 set /a YYYY=%YYYY%-1 set MM=12 ) :: 判断当前月份的总天数 set "days_in_month=31" :: 小月都是30天 if !MM! equ 4 set days_in_month=30 if !MM! equ 6 set days_in_month=30 if !MM! equ 9 set days_in_month=30 if !MM! equ 11 set days_in_month=30 :: 单独处理2月,判断闰年 if !MM! equ 2 ( set /a leap=!YYYY!%%4 if !leap! equ 0 ( set /a leap=!YYYY!%%100 if !leap! equ 0 set /a leap=!YYYY!%%400 ) if !leap! equ 0 ( set days_in_month=29 ) else ( set days_in_month=28 ) ) :: 把日期设为上个月的最后一天 set DD=!days_in_month! ) :: 补全月份和日期的前导0,确保是两位数字 if !MM! lss 10 set MM=0!MM! if !DD! lss 10 set DD=0!DD! :: 组合成yyyymmdd格式 set YESTERDAY=!YYYY!!MM!!DD! echo 前一天日期:!YESTERDAY! endlocal
这个脚本的逻辑是:先给当前日期减1天,如果日期变成负数就退到上个月的最后一天,月份变成0就退到上一年的12月,同时处理闰年2月的特殊情况,最后补全两位数字得到目标格式。
内容的提问来源于stack exchange,提问作者Globe throttler
相关产品推荐
相关产品推荐

