下面的代码(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中的错误/有趣控件。
请注意我无法控制此日期值,它来自第三方平台。
答案 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