Java 8 LocalDateTime正在解析无效日期

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)

  • 在格式字符串中将yyyy更改为uuuu,然后无需使用ERA (3认同)

Pal*_*ino 9

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)