SimpleDateFormat 解析和不明确的日期格式

问题描述 投票:0回答:3

我试图拒绝从日期格式 HH 解析“18:00”(通过 SimpleDateFormat::parse)。有没有一种方法可以让这种情况发生而无需额外的代码?日期格式是否接受 $/正则表达式?我已将 setLenient 启用为 false,并且 18:00 仍然采用 HH 日期格式。

我意识到我可以对正在解析的字符串进行其他比较,但我正在寻找一种在 DateFormat 字符串中执行此操作的方法。

java parsing date
3个回答
1
投票

不,自卫队不允许“规则”。它只是根据模式解析和格式化日期,而不是正则表达式类型的模式,所以没有正则表达式。


0
投票
  1. SimpleDateFormat 确实执行一种验证 - 如果您尝试解析一个不代表指定格式的字符串,它将抛出 ParseException (尽管 Javadoc 很奇怪,如果开始不满足,则仅抛出异常格式(http://download.oracle.com/javase/1.4.2/docs/api/java/text/DateFormat.html#parse(java.lang.String)))。

  2. 如果日期格式只是“HH”,则字符串“18:00”符合该格式。 如果日期格式是“HH:MMM”(2 位数字的小时,后跟 3 个字母的月份),那么可能会抛出 ParseException。

如果您尝试像这样进行验证,那么我建议使用 Regex,甚至仅使用 Java 代码。 我不确定您想要实现什么目标,所以恐怕我无法提供进一步的建议。


0
投票

拒绝“18:00”的解析(通过SimpleDateFormat::parse)

如果您坚持只接受 12 小时时间,则必须考虑白天或夜晚的 AM-PM 指示器。请注意,AM/PM 指示器的文本因文化而异,因此取决于

Locale

在现代 Java 中,使用 java.time 类。切勿使用遗留类

Date
Calendar
SimpleDateFormat

String input = "06:00 PM" ;  //  "18:00 PM"  "06:00 PM"

Locale locale = Locale.of("en" , "US");
DateTimeFormatter f = DateTimeFormatter.ofPattern( "hh:mm a" ).withLocale ( locale );

LocalTime lt = LocalTime.parse( input, f );  // Throws DateTimeParseException for "18:00 PM" but works for "06:00 PM".

System.out.println ( "lt.toString() = " + lt );

18:00

将该输入更改为

"18:00"
"18:00 PM"
,然后抛出
DateTimeParseException

如果您想拒绝此类输入,请使用 try-catch 来捕获该异常。

© www.soinside.com 2019 - 2024. All rights reserved.