下面的代码(Java8)片段在使用LocalDateTime.parse,解析的日期内,当我的date time的秒值为零时,丢弃 date time的 seconds部分,如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);
Lexical Date打印为:
词法日期: 2018-07-10T00:00
而不是:
词法日期: 2018-07-10T00:00:00
现在,这将影响公历的日期值,当删除第二个日历时,将返回null。其他情况下,当秒值大于零时,它可以完美地工作。
javax.xml.datatype.DatatypeFactory.newInstance().newXMLGregorianCalendar(lexicalDate)
当由于解析的字符串中的00秒值而删除秒值时,上面的代码将返回null。
有没有人可以提供一个更好的方法来使用LocalDate时间来处理这个问题,否则它可能是Java8 LocalDateTime中的一个bug/有趣的控件。
请注意,我无法控制此日期值,它来自第三方平台。
发布于 2018-06-11 01:54:52
特性,而不是bug
您将看到LocalDateTime::toString
方法使用的特定DateTimeFormatter
的文档化行为。
摘录,我的重点是:
输出将为以下ISO-8601格式之一:
uuuu-mm-dd‘T’mm:mm
uuuu-mm-dd‘T’ss:mm:ss
uuuu-mm-dd‘T’dd:mm:ss.SSS
uuuu-mm-dd‘T’dd:mm:ss.SSSSSS
uuuu-mm-dd‘T’dd:mm:ss.SSSSSSSSS
使用的格式将是输出时间的全值的最短,其中省略的部分隐含为零。
如果在生成表示LocalDateTime
的值的字符串时需要其他行为,请使用不同的DateTimeFormatter
并将其传递给LocalDateTime::format
。
String output = myLocalDateTime.format( someOtherFormatter ) ;
LocalDateTime
没有“格式”,因为它不是文本。解析或生成特定格式的String
对象是DateTimeFormatter
的工作。
发布于 2018-06-11 01:59:59
您需要使用适当的格式化程序来格式化日期,而不是通过调用toString()
来使用默认格式化程序。
final String lexicalDate = localDateTime.format(dateTimeFormatter);
发布于 2019-11-30 02:39:58
您可以使用下面的模式来实现所需的格式:
DateTimeFormatter.ofPattern("yyyy-MM-dd'T'HH:mm:ssz");
https://stackoverflow.com/questions/50786482
复制相似问题