Ant脚本使用tstamp删除旧备份文件报错无法解析日期该如何解决
问题根因定位
报错的核心原因是日期生成时的locale规则和日期解析时的locale规则不匹配,Ant的<tstamp>生成日期时用你指定的locale,但是<date>选择器解析输入的datetime值时默认用JVM系统默认locale,一旦两者不一致就会出现AM/PM标识识别失败、日期格式解析错误的问题。
排查步骤
- 第一步:先打印生成的BKRetention值确认格式,在tstamp标签后增加一行
<echo message="Retention date value: ${BKRetention}"/>,运行脚本确认输出的日期是否符合MM/dd/yyyy hh:mm a格式,比如是否出现非英文的AM/PM标识、月日位置颠倒等问题。 - 第二步:检查tstamp的locale配置,你当前写的
locale="en,UK"不符合Java locale的标准写法,标准写法是用下划线分隔语言和地区,英国英语应为en_GB,美国英语为en_US,错误的locale写法在旧版JDK/Ant中可能被容错兼容,版本升级后就会失效。 - 第三步:排查近期环境变更,确认是否有JDK版本升级、Ant版本升级、操作系统区域语言设置修改、运行脚本的用户locale配置修改的操作,这些变更都会触发默认locale的变化。
解决方案
方案1:统一生成和解析的locale配置(最快速修复)
给<date>标签增加和tstamp一致的locale配置,同时修正locale的写法,修改后代码如下:
<target name="RemoveOldBackups" > <tstamp> <!-- 修正locale写法,用en_US匹配MM/dd/yyyy的美式日期格式 --> <format property="BKRetention" pattern="MM/dd/yyyy hh:mm a" locale="en_US" offset="-${Backup.Retention.Number}" unit="${Backup.Retention.Unit}"/> </tstamp> <echo message="Retention date value: ${BKRetention}"/> <for list="${Database.List}" param="database" parallel="${parallel}" threadCount="${threadCount}"> <sequential> <echo message="Working on Database: @{database} Full path: ${Database.List.@{database}.Location}${Database.List.@{database}.FileName}" /> <delete> <fileset dir="${Database.List.@{database}.LocalBackup}" includes="**/*.bkp"> <!-- 增加locale配置和生成时保持一致 --> <date datetime="${BKRetention}" when="before" locale="en_US"/> </fileset> </delete> </sequential> </for> </target>
方案2:使用无locale依赖的日期格式(最稳定,推荐)
直接用24小时制的纯数字日期格式,完全避开locale带来的兼容问题,修改后代码如下:
<target name="RemoveOldBackups" > <tstamp> <!-- 用纯数字格式,无 locale 依赖 --> <format property="BKRetention" pattern="yyyyMMddHHmm" offset="-${Backup.Retention.Number}" unit="${Backup.Retention.Unit}"/> </tstamp> <for list="${Database.List}" param="database" parallel="${parallel}" threadCount="${threadCount}"> <sequential> <echo message="Working on Database: @{database} Full path: ${Database.List.@{database}.Location}${Database.List.@{database}.FileName}" /> <delete> <fileset dir="${Database.List.@{database}.LocalBackup}" includes="**/*.bkp"> <!-- 指定解析格式和生成格式一致,无需配置locale --> <date datetime="${BKRetention}" when="before" pattern="yyyyMMddHHmm"/> </fileset> </delete> </sequential> </for> </target>
内容的提问来源于stack exchange,提问作者jdpjamesp
相关产品推荐
相关产品推荐

