Zee*_*han 22 java datetime parsing
我想在客户端验证日期,所以我写了下面的代码.但是我没有得到异常,而是获得了2月31日日期字符串的正确日期对象,这显然是无效日期.
public class Test {
public static void main(String[] args) {
String dateFormat = "HH:mm:ss MM/dd/yyyy";
String dateString = "11:30:59 02/31/2015";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat, Locale.US);
try {
LocalDateTime date = LocalDateTime.parse(dateString, dateTimeFormatter);
System.out.println(date);
} catch (Exception e) {
// Throw invalid date message
}
}
}
Run Code Online (Sandbox Code Playgroud)
输出:2015-02-28T11:30:59
有谁知道为什么LocalDateTime解析这个日期而不是抛出异常.
Jon*_*eet 35
你只需要一个严格的ResolverStyle.
解析文本字符串分两个阶段进行.阶段1是根据添加到构建器的字段的基本文本解析.阶段2将解析的字段 - 值对解析为日期和/或时间对象.此样式用于控制阶段2的解析方式.
示例代码 - withResolverStyle(ResolverStyle.STRICT)重要的变化在哪里,uuuu而不是使用而不是yyyy(在哪里uuuu"年"和"yyyy"是"年代",因此含糊不清):
import java.time.*;
import java.time.format.*;
import java.util.*;
public class Test {
public static void main(String[] args) {
String dateFormat = "HH:mm:ss MM/dd/uuuu";
String dateString = "11:30:59 02/31/2015";
DateTimeFormatter dateTimeFormatter = DateTimeFormatter
.ofPattern(dateFormat, Locale.US)
.withResolverStyle(ResolverStyle.STRICT);
try {
LocalDateTime date = LocalDateTime.parse(dateString, dateTimeFormatter);
System.out.println(date);
} catch (DateTimeParseException e) {
// Throw invalid date message
System.out.println("Exception was thrown");
}
}
}
Run Code Online (Sandbox Code Playgroud)
Java 8 DateTimeFormatter使用yyyy表示YEAR_OF_ERA,uuuu表示YEAR.您需要修改模式字符串,如下所示:
String dateFormat = "HH:mm:ss MM/dd/uuuu";
Run Code Online (Sandbox Code Playgroud)
DateTimeFormatter默认使用SMART解析器样式,但您希望它使用STRICT解析器样式.修改dateTimeFormatter初始化代码,如下所示:
DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern(dateFormat, Locale.US)
.withResolverStyle(ResolverStyle.STRICT);
Run Code Online (Sandbox Code Playgroud)