【问题标题】:ZonedDateTime now function mandatorily contains second valueZonedDateTime 现在函数强制包含第二个值
【发布时间】:2018-03-07 11:35:36
【问题描述】:

我的代码需要字符串格式的当前 UTC 时间。

String date = ZonedDateTime.now(ZoneOffset.UTC).withNano(0).toString();

这在大多数情况下都可以正常工作,除非时间的秒值为零。

Normal output: 2018-03-07T11:33:09Z
Problem output: 2018-03-06T11:33Z

第二次跳过打印。即使秒数为零,如何强制打印?

【问题讨论】:

    标签: java datetime-format java-time zoneddatetime


    【解决方案1】:

    您可以使用格式化程序始终打印秒部分:

    DateTimeFormatter dtf = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX");
    String s = ZonedDateTime.now(ZoneOffset.UTC).withNano(0).format(dtf);
    System.out.println(s); // 2018-03-20T16:15:07Z
    

    【讨论】:

      【解决方案2】:

      如果您使用像suggested by Meno 这样的DateTimeFormatter,您甚至不需要将 nanos 值设置为零:

      DateTimeFormatter fmt = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssX");
      String formatted = ZonedDateTime.now(ZoneOffset.UTC).format(fmt);
      System.out.println(formatted); // 2018-03-08T13:33:52Z
      

      这是因为格式化程序只打印格式中指定的字段。在本例中,它使用HH:mm:ss,表示“小时:分钟:秒”。由于秒数部分不在模式中,因此不会打印,因此无需调用withNano

      这听起来像是一个小细节,但由于所有这些类都是不可变的,像withNano 这样的方法总是会创建一个新对象,在这种情况下你不需要这样做,所以使用格式化程序不仅可以为你提供所需的输出,但它也避免了创建不必要的对象(只有一个 ZonedDateTime,这听起来可能无关紧要,但在格式化大量日期的情况下,这可能会有所不同,IMO)。

      只有当我真的想将此字段设置为零时,我才会调用withNano(0)。如果我只是不想在格式化时打印它,我不会调用它。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2021-11-02
        • 2022-10-19
        • 2017-04-28
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-07-30
        相关资源
        最近更新 更多