我试图拒绝从日期格式 HH 解析“18:00”(通过 SimpleDateFormat::parse)。有没有一种方法可以让这种情况发生而无需额外的代码?日期格式是否接受 $/正则表达式?我已将 setLenient 启用为 false,并且 18:00 仍然采用 HH 日期格式。
我意识到我可以对正在解析的字符串进行其他比较,但我正在寻找一种在 DateFormat 字符串中执行此操作的方法。
不,自卫队不允许“规则”。它只是根据模式解析和格式化日期,而不是正则表达式类型的模式,所以没有正则表达式。
SimpleDateFormat 确实执行一种验证 - 如果您尝试解析一个不代表指定格式的字符串,它将抛出 ParseException (尽管 Javadoc 很奇怪,如果开始不满足,则仅抛出异常格式(http://download.oracle.com/javase/1.4.2/docs/api/java/text/DateFormat.html#parse(java.lang.String)))。
如果日期格式只是“HH”,则字符串“18:00”符合该格式。 如果日期格式是“HH:MMM”(2 位数字的小时,后跟 3 个字母的月份),那么可能会抛出 ParseException。
如果您尝试像这样进行验证,那么我建议使用 Regex,甚至仅使用 Java 代码。 我不确定您想要实现什么目标,所以恐怕我无法提供进一步的建议。
拒绝“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 来捕获该异常。