具有多个模式的 DateTimeFormatter 不起作用

DateTimeFormatter with multiple pattern not working

提问人:Sahib Yar 提问时间:8/17/2023 最后编辑:Arvind Kumar AvinashSahib Yar 更新时间:8/17/2023 访问量:64

问:

这两种模式在单独测试时工作正常,但它们不能在单个语句中协同工作。ofPattern { "[]" + "[]"}

请指导我在这里错过了什么

import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.time.LocalDate;
import java.time.LocalDateTime;
import java.time.LocalTime;

public class SampleProgram {
    
    private static final DateTimeFormatter dateTimeFormats = DateTimeFormatter.ofPattern(
            "[yyyy-MM-dd'T'HH:mm:ss.SSS]" + //: Year, month, day, 'T' separator, hour, minute, second, and milliseconds (e.g., 2023-05-21T12:34:56.789)
            "[yyyy-MM-dd'T'HH:mm:ss.SSSSSS]"  //: Year, month, day, 'T' separator, hour, minute, second, and microseconds (e.g., 2023-05-21T12:34:56.123456)
    );

    private static final String[] inputArray = new String[]{
        "2021-01-30T23:45:00.123",
        "2023-08-15T12:34:56.789123",
    };

    
    public static void main(String[] args) {
        
        for (var input : inputArray) {
            var ignore = LocalDateTime.parse(input, dateTimeFormats);
        }
        System.out.println("No exception occured!");
    }
}

输出:

Exception in thread "main" java.time.format.DateTimeParseException: Text '2023-08-15T12:34:56.789123' could not be parsed, unparsed text found at index 23
at java.base/java.time.format.DateTimeFormatter.parseResolved0(DateTimeFormatter.java:2049)
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948)at java.base/java.time.LocalDateTime.parse(LocalDateTime.java:492)
    at SampleProgram.main(SampleProgram.java:25)
java 时间 datetime-parsesing datetimeformatter

评论


答:

4赞 Arvind Kumar Avinash 8/17/2023 #1

您不需要任何字符串,因为您的两个日期时间字符串都采用 ISO 8601 格式,这是类型使用的默认格式。DateTimeFormatterjava.time

public static void main(String[] args) {
    for (var input : inputArray) {
        var ignore = LocalDateTime.parse(input);
    }
    System.out.println("No exception occured!");
}

输出:

No exception occurred!

如果您想使用 ,请将其更改为仅将小数秒部分设置为可选。DateTimeFormatter

DateTimeFormatter dateTimeFormats = DateTimeFormatter.ofPattern(
                    "yyyy-MM-dd'T'HH:mm:ss[.[SSSSSS][SSS]]");

在线演示

Trail: Date Time 了解有关现代日期时间 API 的更多信息。

1赞 Ch.K. 8/17/2023 #2

如果将模式的顺序更改为

私有静态 final DateTimeFormatter dateTimeFormats = DateTimeFormatter.ofPattern( “[yyyy-MM-dd'T'HH:mm:ss。SSSSSS]“ + //:年、月、日、”T“分隔符、时、分、秒和微秒(例如, 2023-05-21T12:34:56.123456) “[yyyy-MM-dd'T'HH:mm:ss。SSS]“ //:年、月、日、”T“分隔符、小时、分钟、秒和毫秒(例如, 2023-05-21T12:34:56.789) );

这应该可以解决问题。

因此,带有微秒的时间戳将首先使用解析器处理微秒。在我们的示例中,微秒时间戳首先由毫秒级解析器处理,该解析器抱怨他无法处理的微秒部分。