创建文件夹日期格式报错:前一天日期小于10时缺失前导零
解决批处理中前一天日期生成的前导零问题
你的问题根源在于两个核心点:批处理的SET /A会把带前导零的数字解析为八进制,以及部分系统日期格式里1-9号的日会以空格开头(比如 9-04-2019)。当你直接用SET /A Yesterday=%day%-1时,如果%day%是09,八进制里没有09这个有效数,会被当作0处理,0-1就得到了-1,从而出现-1-04-2019的错误;而直接echo %day%-%month%-%year%是字符串拼接,所以能正常显示。
下面是完整的解决方案,既处理1-9号的前导零问题,也兼顾跨月(比如1号的前一天是上月最后一天)的场景:
修正后的代码
@echo off SETLOCAL ENABLEDELAYEDEXPANSION :: 获取原始日期的各组件 SET "raw_day=%date:~0,2%" SET "Month=%date:~3,2%" SET "Year=%date:~6,4%" :: 第一步:处理原始日的空格/前导零,转换为可靠的数值 SET "day=%raw_day%" :: 处理日期开头是空格的情况(比如" 9"转成"09") IF "%day:~0,1%" == " " SET "day=0%day:~1,1%" :: 去掉前导零,避免SET /A解析为八进制(08、09在八进制中无效) SET /A day_num=1%day% - 100 :: 第二步:计算昨天的日 SET /A Yesterday=day_num - 1 :: 第三步:处理跨月情况(今天是当月1号,需要获取上月最后一天) IF %Yesterday% EQU 0 ( :: 计算上月的月份 SET /A Month_num=1%Month% - 100 SET /A Month_num=Month_num - 1 :: 如果上月是去年12月 IF !Month_num! EQU 0 ( SET /A Year=Year - 1 SET "Month_num=12" ) :: 给月份补前导零 SET "Month=!Month_num!" IF !Month_num! LSS 10 SET "Month=0!Month_num!" :: 判断上月的最后一天 :: 31天的月份 IF !Month_num! IN (1,3,5,7,8,10,12) SET "Yesterday=31" :: 30天的月份 IF !Month_num! IN (4,6,9,11) SET "Yesterday=30" :: 二月,判断闰年 IF !Month_num! EQU 2 ( SET /A leap=Year %% 4 IF !leap! EQU 0 ( SET /A leap=Year %% 100 IF !leap! NEQ 0 SET "Yesterday=29" IF !leap! EQU 0 ( SET /A leap=Year %% 400 IF !leap! EQU 0 SET "Yesterday=29" ELSE SET "Yesterday=28" ) ) ELSE ( SET "Yesterday=28" ) ) ) ELSE ( :: 给昨天的日补前导零,确保是两位格式 IF %Yesterday% LSS 10 SET "Yesterday=0%Yesterday%" ) :: 输出最终结果 echo %Yesterday%-%Month%-%Year% echo %raw_day%-%Month%-%Year% ENDLOCAL
关键步骤解释
处理原始日的格式:
- 把空格开头的日(比如
9)转换为09,保证格式统一。 - 通过
1%day% - 100的技巧,把09转成纯数字9,避免SET /A将其识别为无效八进制数。
- 把空格开头的日(比如
补前导零:
- 计算出
Yesterday后,判断如果小于10,就给它添加前导零,确保输出是08-04-2019这样的格式。
- 计算出
跨月处理:
- 当
Yesterday为0时(即今天是当月1号),自动计算上月的月份和年份,并根据月份判断上月最后一天的天数,包括闰年二月的特殊情况。
- 当
内容的提问来源于stack exchange,提问作者Michael Salanson
相关产品推荐
相关产品推荐

