ZonedDateTime现在功能强制包含第二个值

时间:2018-03-07 11:35:37

标签: java datetime-format java-time zoneddatetime

我的代码需要String格式的当前UTC时间。

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

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

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

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

2 个答案:

答案 0 :(得分:2)

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

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

答案 1 :(得分:0)

如果你使用像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)。如果我只是不想在格式化时打印它,我就不会打电话给它。