日期精准匹配MM/dd/yy,MM/dd/yyyy

这段代码主要处理日期字符串,检查并尝试将其转换为两种可能的格式:MM/dd/yy 和 MM/dd/yyyy。它首先检查字符串是否包含斜杠,然后分别用正则表达式处理不同的日期格式,最后使用SimpleDateFormat进行解析。
String dateString = "5/26/22";
Date date = null;
if(dateString.contains("/")){
	String temp = dateString.replaceAll("/", "");
	String temp2 = dateString.replaceFirst("\\d+/\\d+/", "");
	if(3 < temp.length() && temp.length() < 7 && temp2.length()==2) {
		//兼容MM/dd/yy格式,如5/26/22
		SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yy");
		date = dateFormat.parse(dateString);
		return date;
	}else if (5 < temp.length() && temp.length() < 9 && temp2.length()==4) {
		//兼容MM/dd/yyyy格式,如5/26/2022
		SimpleDateFormat dateFormat = new SimpleDateFormat("MM/dd/yyyy");
		date = dateFormat.parse(dateString);
		return date;
	}
}

如果 Windows 2000 系统的日期格式为 **`YYYY/MM/DD`**(例如:`2024/08/14`),那么我们之前的脚本中使用 `%date:~4,10%` 就不再适用,需要重新调整日期提取和解析逻辑。 --- ### ⚠️ 问题说明 在命令行中执行: ```cmd echo %date% ``` 若输出如下格式: ``` Wed 2024/08/14 ``` 则: - `%date:~0,3%` = `Wed`(星期) - `%date:~4,10%` = `2024/08/14` → 这是 **YYYY/MM/DD** 格式 这意味着我们需要从该字符串中正确提取: - 年(YYYY)→ 第1段 - 月(MM)→ 第2段 - 日(DD)→ 第3段 然后传入儒略日计算函数进行比较。 --- ### ✅ 解决方案:适配 `YYYY/MM/DD` 格式的 `.bat` 脚本 以下是修改后的完整 `.bat` 脚本,专为 **`YYYY/MM/DD` 日期格式** 设计,支持多个路径下删除超过 30 天的文件与子文件夹(不删根目录)。 ```bat @echo off setlocal enabledelayedexpansion :: ============================================= :: 清理脚本 for Windows 2000 (日期格式: YYYY/MM/DD) :: 删除指定路径中存在30天以上的文件和子文件夹 :: ============================================= :: 定义多个要清理的路径 set "paths[0]=C:\temp" set "paths[1]=D:\logs" set "paths[2]=E:\backup\data" set path_count=2 :: 最大索引号(共3个路径) :: 获取当前日期并转为儒略日 call :GetCurrentDate yyyy mm dd call :DateToJulian !mm! !dd! !yyyy! today_julian :: 遍历所有路径 set idx=0 :loop_paths if %idx% gtr %path_count% goto end_loop call set current_path=%%paths[%idx%]%% if not exist "%current_path%" ( echo [警告] 路径不存在: "%current_path%" goto next_idx ) echo. echo 正在清理路径: "%current_path%" call :CleanupPath "%current_path%" !today_julian! :next_idx set /a idx+=1 goto loop_paths :end_loop echo. echo 所有路径清理完成。 pause exit /b :: ===================================================== :: 子程序:清理单个路径下的旧内容 :: 参数:%1 = 路径,%2 = 当前儒略日 :: ===================================================== :CleanupPath setlocal set "target=%~1" set /a today_jd=%2 :: 删除旧文件 for /f "delims=" %%f in ('dir "%target%\*" /s /a-d /b 2^>nul') do ( call :GetFileDate "%%f" f_yy f_mm f_dd if defined f_yy ( call :DateToJulian !f_mm! !f_dd! !f_yy! file_jd set /a diff = today_jd - file_jd if !diff! GTR 30 ( echo 删除文件: %%f (!diff! 天前) del "%%f" >nul 2>&1 ) ) ) :: 删除旧子文件夹 for /f "delims=" %%d in ('dir "%target%\*" /ad /s /b 2^>nul') do ( call :GetDirDate "%%d" d_yy d_mm d_dd if defined d_yy ( call :DateToJulian !d_mm! !d_dd! !d_yy! dir_jd set /a diff = today_jd - dir_jd if !diff! GTR 30 ( echo 删除目录: %%d (!diff! 天前) rd /q /s "%%d" >nul 2>&1 ) ) ) endlocal goto :eof :: ===================================================== :: 函数:获取当前系统日期 (YYYY MM DD) :: 提取 %date% 中的 YYYY/MM/DD 并拆分 :: ===================================================== :GetCurrentDate set "full_date=%date%" :: 提取 YYYY/MM/DD 部分(从第4位开始取10字符) set "date_part=%full_date:~4,10%" :: 替换 / 为空格,便于解析 set "date_clean=%date_part:/= %" for /f "tokens=1,2,3" %%a in ("%date_clean%") do ( set %1=%%a :: YYYY set %2=%%b :: MM set %3=%%c :: DD ) goto :eof :: ===================================================== :: 函数:获取文件最后修改日期 (返回 YYYY MM DD) :: ===================================================== :GetFileDate set "file=%~1" for %%i in ("%file%") do set "ts=%%~ti" :: 取前10位:YYYY/MM/DD HH:MM set "file_date=%ts:~0,10%" if "%file_date%"==" " ( endlocal & goto :eof ) set "file_clean=%file_date:/= %" for /f "tokens=1,2,3" %%a in ("%file_clean%")) do ( set %2=%%a :: YYYY set %3=%%b :: MM set %4=%%c :: DD ) goto :eof :: ===================================================== :: 函数:获取目录日期 (通过 dir 命令解析第一行) :: 返回 YYYY MM DD :: ===================================================== :GetDirDate set "dir_path=%~1" set d_yy= for /f "tokens=1,2,3 delims=/ " %%a in ('dir "%dir_path%" ^| find "/" ^| find "<DIR>" ^| find ".." ^| find /v "." 2^>nul') do ( set d_yy=%%a set d_mm=%%b set d_dd=%%c goto :got_dir_date ) :got_dir_date if defined d_yy ( set %2=%d_yy% set %3=%d_mm% set %4=%d_dd% ) goto :eof :: ===================================================== :: 函数:将 MM DD YYYY 转为儒略日(Gregorian 公历) :: 输入顺序:MM DD YYYY :: ===================================================== :DateToJulian set /a m=%1 set /a d=%2 set /a y=%3 if %m% LEQ 2 ( set /a y -= 1 set /a m += 12 ) set /a a = y / 100 set /a b = 2 - a + (a / 4) set /a jd = (1461 * y) / 4 + (153 * (m + 1)) / 5 + d + 1720994 + b set "%4=%jd%" goto :eof ``` --- ### ✅ 使用说明(针对 YYYY/MM/DD 格式) 1. **确保系统日期显示为 `Wed YYYY/MM/DD`** 2. 保存脚本为 `.bat` 文件(如 `clean_yyyy_mm_dd.bat`) 3. 修改 `paths[0]`, `[1]`, ... 为你自己的实际路径 4. 设置 `path_count` 为最后一个索引值 5. (可选)先用 `echo del` 测试删除项 --- ### 🔍 关键改动点 | 功能 | 改动说明 | |------|----------| | `GetCurrentDate` | 从 `%date:~4,10%` 提取 `YYYY/MM/DD`,再拆分为 `YYYY MM DD` | | `GetFileDate` | 文件时间戳也按 `YYYY/MM/DD` 解析 | | `GetDirDate` | `dir` 输出的第一列是 `YYYY/MM/DD`,直接按 `/` 分割 | | `DateToJulian` | 仍使用 `MM DD YYYY` 作为输入,所以需在调用前交换顺序 | > 💡 注意:虽然日期是 `YYYY/MM/DD`,但 `DateToJulian` 函数内部仍要求参数顺序为 `MM DD YYYY`,因此调用时做了变量顺序调整。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值