2

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

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

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

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

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

4

2 回答 2

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
于 2018-03-07T13:11:54.640 回答
0

如果您使用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,这意味着"hours:minutes:seconds"。由于秒的分数不在模式中,它们没有被打印出来,所以没有必要调用withNano.

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

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

于 2018-03-08T13:38:44.793 回答