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

DateTimeFormat.forPattern传入日期字符串作为格式不抛异常,是否为预期行为?

这确实是Joda Time的预期行为,但你用错了方法!

你这里的核心问题是混淆了DateTimeFormat.forPattern()的作用——它是用来定义日期时间的格式规则,而不是直接验证某个日期字符串是否合法。

为什么调用forPattern("2007-05-24 00:00-06:00")不抛异常?

Joda Time的模式解析逻辑中,除了y、M、d、H、m这些特殊的模式字符外,其他字符(比如数字、连字符、空格)都会被当作字面量字符处理。也就是说,你传入的这个字符串在Joda Time看来是一个合法的格式模式——这个模式的要求是:字符串必须完全等于2007-05-24 00:00-06:00才能被解析成功。因为它是一个有效的模式定义,所以自然不会抛出异常。

正确的验证方式

如果你要验证某个字符串是否符合特定的日期时间格式(同时确保是实际存在的日期),正确的步骤应该是:

  1. 先创建对应目标格式的格式化器,比如针对yyyy-MM-dd HH:mm±HH:mm这种带时区偏移的格式,模式字符串应该是"yyyy-MM-dd HH:mmZZ"
  2. 用这个格式化器去解析待验证的字符串,解析失败时会抛出异常,以此判断格式是否合法

举个实际的代码例子:

import org.joda.time.DateTime;
import org.joda.time.format.DateTimeFormat;
import org.joda.time.format.DateTimeFormatter;

public class DateTimeValidation {
    public static boolean isValidDateTime(String input) {
        // 定义你期望的日期时间格式模式
        DateTimeFormatter formatter = DateTimeFormat.forPattern("yyyy-MM-dd HH:mmZZ");
        try {
            // 尝试解析字符串,成功则说明格式合法且是有效日期
            formatter.parseDateTime(input);
            return true;
        } catch (IllegalArgumentException e) {
            // 解析失败,格式错误或日期无效
            return false;
        }
    }

    public static void main(String[] args) {
        System.out.println(isValidDateTime("2007-05-24 00:00-06:00")); // true
        System.out.println(isValidDateTime("2007-13-32 25:61-06:00")); // false
    }
}

这样既可以验证格式是否匹配,也能自动排除那些格式正确但实际不存在的日期(比如13月、32号、25点这类无效值)。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.19 08:38:48