You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.06 22:24:02