【问题标题】:Java 8 LocalDateTime dropping 00 seconds value when parsing date string value with 00 seconds like "2018-07-06 00:00:00"Java 8 LocalDateTime 在解析 00 秒的日期字符串值时丢弃 00 秒值,例如“2018-07-06 00:00:00”
【发布时间】:2018-06-10 17:49:06
【问题描述】:

下面的代码 (Java 8) sn-p 当秒值在使用 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 中的一个错误/有趣的控件。

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

【问题讨论】:

  • 为什么你想要XMLGregorianCalendar?问是因为如果要在 XML 中使用 XML 字符串,在我看来,您似乎只是使用该类来获取您输入的相同字符串,您可以考虑跳过这个步骤。
  • 好吧,我有一个类用于使用 绑定 WSDL dateTime/date。默认情况下,JAXB 为 WSDL 中的任何 dateTime 或 date 类型字段生成 javax.xml.datatype.XMLGregorianCalendar。我的 WSDL 生成的类的日期字段为 XMLGregorianCalendar。我求助于使用 jaxb 全局绑定,因为我使用的 WSDL 在 dateTime 值方面不一致,因为有时它会返回没有时间组件的日期,因此最终会从客户端接收空日期值。

标签: java datetime java-8


【解决方案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.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 对象。

【讨论】:

  • 澄清一下,您使用格式化程序创建LocalDateTime 实例这一事实并不意味着该实例会记住它,您只是指示您将给出的字符串的形状给LocalDateTime::parse;因此,它不会影响toString
【解决方案2】:

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

final String lexicalDate = localDateTime.format(dateTimeFormatter);

【讨论】:

    【解决方案3】:

    您可以使用下面的模式来实现所需的格式:

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

    【讨论】:

      【解决方案4】:

      DateTimeFormatter 解析后从日期中删除 00,您只需要重新格式化即可

      请参考以下代码sn-p:

      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
      

      【讨论】:

      • 感谢您的解释。我不认为“DateTimeFormatter 删除 00”是严格正确的,我确信 0 秒仍然在生成的 LocalDateTime 对象内部表示。相反,LocalDateTime.toString() 没有按照 Basil Bourque 的回答中的说明打印它们。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多