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

Java如何校验yyyy-MM-ddTHH:mm:ss.SSSZ格式带时区日期?

带时区ISO 8601日期字符串合法性校验实现

核心实现逻辑

你需要匹配的目标格式为yyyy-MM-ddTHH:mm:ss.SSSZ,合法输入支持两类时区后缀:零时区标识Z、±开头的4位数字时区偏移(例如-0700)。
直接使用JDK8+提供的java.time包下的DateTimeFormatter配合ZonedDateTime即可完成严格校验,不需要引入第三方依赖。

注意避坑点

  • 不要用LocalDateTime解析:该类不支持时区字段,会直接把带时区后缀的合法输入判定为非法
  • 不要直接用DateTimeFormatter.ISO_ZONED_DATE_TIME等内置格式:内置格式兼容多种非目标格式(例如带冒号的时区偏移、秒级精度无毫秒的输入),无法满足严格匹配要求
  • 时区模式不要用单个Z占位:单个Z作为模式符时,要求时区偏移必须带冒号(例如-07:00),无法匹配你给出的-0700这类无冒号格式,需要用XXX作为时区占位符,该模式可同时匹配Z后缀和无冒号的4位偏移

可直接运行的代码示例

import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeParseException;

public class StrictIsoDateValidator {
    // 定义严格匹配目标规则的格式化器,T作为字面量用单引号包裹
    private static final DateTimeFormatter FORMATTER = 
            DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ss.SSSXXX");

    /**
     * 校验日期字符串是否符合yyyy-MM-ddTHH:mm:ss.SSSZ格式
     * @param dateStr 待校验字符串
     * @return 符合格式返回true,否则返回false
     */
    public static boolean isValid(String dateStr) {
        if (dateStr == null || dateStr.isEmpty()) {
            return false;
        }
        try {
            ZonedDateTime.parse(dateStr, FORMATTER);
            return true;
        } catch (DateTimeParseException e) {
            return false;
        }
    }

    public static void main(String[] args) {
        // 合法示例
        String dateRight = "2017-12-25T13:01:59.123-0700";
        String date2Right = "2017-12-25T13:01:59.123Z";
        // 非法示例
        String invalidDate1 = "2017-12-25 13:01:59.123Z"; // 缺少T分隔符
        String invalidDate2 = "2017-12-25T13:01:59.12-0700"; // 毫秒仅2位
        String invalidDate3 = "2017-12-25T13:01:59.123-07:00"; // 时区带冒号,不符合要求

        System.out.println(isValid(dateRight));    // 输出true
        System.out.println(isValid(date2Right));   // 输出true
        System.out.println(isValid(invalidDate1)); // 输出false
        System.out.println(isValid(invalidDate2)); // 输出false
        System.out.println(isValid(invalidDate3)); // 输出false
    }
}

补充说明

只要指定了精确匹配的模式串,DateTimeFormatter默认就会做全字符串匹配,不会做宽松转换(例如不会自动把缺少年月日的输入补全、不会自动适配不同格式的时区写法),不需要额外配置解析策略。

内容的提问来源于stack exchange,提问作者coding2

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.01 19:18:40