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

时间:2018-06-10 17:49:06

标签: java datetime java-8

下面的代码(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)

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

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

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

4 个答案:

答案 0 :(得分:5)

功能,而不是错误

您正在查看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.SSS

     

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

     

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

     

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

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

String output = myLocalDateTime.format( someOtherFormatter ) ;

LocalDateTime没有“格式”,因为不是文字。 DateTimeFormatter的工作是解析或生成特定格式的String个对象。

答案 1 :(得分:3)

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

final String lexicalDate = localDateTime.format(dateTimeFormatter);

答案 2 :(得分:1)

您可以使用以下模式来获得所需的格式:

DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz");

答案 3 :(得分:0)

DateTimeFormatter会在解析后从日期中删除00,只需重新设置格式

请参考以下代码段:

DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
String currentTime= "2017-10-19 22:00:00";
LocalDateTime datetime = LocalDateTime.parse(currentTime,formatter);
//2017-10-19T22:00
String formattedDate=datetime.format(formatter);
//2017-10-19 22:00:00