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才能被解析成功。因为它是一个有效的模式定义,所以自然不会抛出异常。
正确的验证方式
如果你要验证某个字符串是否符合特定的日期时间格式(同时确保是实际存在的日期),正确的步骤应该是:
- 先创建对应目标格式的格式化器,比如针对
yyyy-MM-dd HH:mm±HH:mm这种带时区偏移的格式,模式字符串应该是"yyyy-MM-dd HH:mmZZ" - 用这个格式化器去解析待验证的字符串,解析失败时会抛出异常,以此判断格式是否合法
举个实际的代码例子:
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
相关产品推荐
相关产品推荐

