Java 8 LocalDateTime在使用00秒解析日期字符串值时丢弃00秒值,如"2018-07-06 00:00:00"

Tau*_*ura 7 java datetime java-8

代码(爪哇8)下面片断滴秒部分的我的日期时间时的秒值是的时间内使用解析的LocalDateTime.parse,如2018年7月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);
Run Code Online (Sandbox Code Playgroud)

词汇日期打印为:

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

不论是:

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

现在这会影响格里高利历的日期值,当第二个被删除时,它会返回null.其他情况当秒值大于零时,它完美地工作.

javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar(lexicalDate)
Run Code Online (Sandbox Code Playgroud)

每当秒值被删除时,上面的代码返回null,因为带有解析字符串的00秒值.

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

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

Bas*_*que 9

功能,而不是错误

您正在查看DateTimeFormatterLocalDateTime::toString方法使用 的特定行为的记录行为.

摘录,我的重点:

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

UUUU-MM-dd'T'HH:毫米

UUUU-MM-dd'T'HH:MM:SS

UUUU-MM-dd'T'HH:MM:SS.SSS

UUUU-MM-dd'T'HH:MM:SS.SSSSSS

UUUU-MM-dd'T'HH:MM:ss.SSSSSSSSS

使用的格式将是最短的,输出省略的部分隐含为零的时间的完整值.

如果在生成表示您的值的String时需要其他行为LocalDateTime,请使用其他行为DateTimeFormatter并将其传递给LocalDateTime::format.

String output = myLocalDateTime.format( someOtherFormatter ) ;
Run Code Online (Sandbox Code Playgroud)

LocalDateTime没有"格式",因为它是没有文字.它是DateTimeFormatter解析或生成String特定格式的对象的工作.

  • 为了澄清,你使用格式化程序来创建`LocalDateTime`实例的事实并不意味着实例会记住它,你只是指出你将给`LocalDateTime :: parse`字符串的形状; 因此,它不会影响`toString` (2认同)