Java 8 LocalDateTime 在解析日期字符串值时丢弃 00 秒值,如“2018-07-06 00:00:00”功能,不是错误

2022-09-02 03:52:57

下面的代码 (Java 8) 代码段会删除我的日期时间秒部分,当秒值在使用 LocalDateTime.parse 解析的日期内为时,如 2018-07-10 00:00:00

final DateTimeFormatter dateTimeFormatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
final LocalDateTime localDateTime = LocalDateTime.parse("2018-07-06 00:00:00", dateTimeFormatter);
final String lexicalDate = localDateTime.toString();
System.out.println("Lexical Date : "+ lexicalDate);
final XMLGregorianCalendar gregorianCalendar = DatatypeFactory.newInstance().newXMLGregorianCalendar(lexicalDate);
System.out.println("Gregorian Calendar : "+ gregorianCalendar);

词法日期打印为:

词汇日期 : 2018-07-10T00:00

而不是:

词汇日期 : 2018-07-10T00:00:00

现在,这会影响公历的日期值,当第二个被丢弃时,该日期值将返回 null。当秒值大于零的其他情况时,它可以完美地工作。

javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar(lexicalDate)

每当由于分析的字符串中的 00 秒值而丢弃秒值时,上述代码将返回 null。

有人可以使用LocalDate时间更好地处理此问题吗,否则它可能是Java 8 LocalDateTime中的错误/有趣的控件。

请注意,我无法控制此日期值,它来自第三方平台。


答案 1

功能,不是错误

您正在看到 LocalDateTime::toString 方法使用的特定行为的记录行为。DateTimeFormatter

摘录,我的强调:

输出将采用以下 ISO-8601 格式之一:

uuuu-MM-dd'T'HH:mm

uuuu-MM-dd'T'HH:mm:ss

uuuu-MM-dd'T'HH:mm:ss.断续器

uuuu-MM-dd'T'HH:mm:ss.断续器

uuuu-MM-dd'T'HH:mm:ss.断续器

使用的格式将是输出省略部分暗示为零的时间的完整值的最短格式。

如果希望在生成 String 时出现其他行为来表示 LocalDateTime 的值,请使用其他 DateTimeFormatter 并将其传递给 LocalDateTime::format

String output = myLocalDateTime.format( someOtherFormatter ) ;

没有“格式”,因为它不是文本。它的工作是解析或生成特定格式的 String 对象。LocalDateTimeDateTimeFormatter


答案 2

您需要使用正确的格式化程序格式化日期,而不是通过调用 来使用默认格式化程序。toString()

final String lexicalDate = localDateTime.format(dateTimeFormatter);