如何在Java中以ISO日期格式打印当前时间和日期?

8

我需要按照以下格式发送当前日期和时间的ISO格式:

'2018-02-09T13:30:00.000-05:00'

我已经编写了以下代码:

Date date = new Date();
SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm");
SimpleDateFormat formatter1 = new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.000'Z'");
System.out.println(formatter.format(date));
System.out.println(formatter1.format(date));

它以以下方式打印出来:
2018-04-30T12:02
2018-04-30T12:02:58.000Z

但它没有按照上述格式打印。我该如何获得像格式中显示的-5:00,它代表什么?


1
不是答案,但-05:00表示相对于GMT时间的时区。 - Tim Biegeleisen
那么如何将此与当前时间一起打印出来? - azaveri7
3
你需要的模式是 "yyyy-MM-dd'T'HH:mm:ss.SXXX" - ernest_k
1
尝试不要在第二个SimpleDateFormat中用单引号括住Z。我认为这样就可以了,但现在无法验证。当你用单引号括住它时,你只是要求一个字面上的Z。 - yshavit
2个回答

14

在Java 8中,您可以使用新的java.time API:

OffsetDateTime now = OffsetDateTime.now();
DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME;
System.out.println(formatter.format(now)); // e.g. 2018-04-30T08:43:41.4746758+02:00
上述使用了标准的 ISO 日期时间格式化程序。您也可以使用以下方式截断毫秒:
OffsetDateTime now = OffsetDateTime.now().truncatedTo(ChronoUnit.MILLIS);

这样会产生类似以下结果(小数点后只保留3位):

2018-04-30T08:54:54.238+02:00

我简直不敢相信这是如此简单,但这也是为什么他们放弃了旧的日期API的原因...对于大多数人来说,它太难了 +1。 - Tim Biegeleisen
除了毫秒是3位数字(根据OP的要求),答案很好。 - MadProgrammer
1
@MadProgrammer 啊,我没注意到,我想第一次测试它只是巧合地有3个数字。这是ISO日期格式常量,所以我希望这也是一个可接受的格式。 - Jorn Vernee
从我的角度来看,假设接收数据的人使用适当的解析器,那应该是没问题的,但这将成为他们的问题 ;) - MadProgrammer
1
无论小数位数如何,它都符合ISO 8601标准,因此在使用时可能会起作用。 - Ole V.V.

3

简单的解决方案:

    System.out.println(OffsetDateTime.now(ZoneId.of("America/Panama")).toString());

刚刚我得到了以下输出:

2018-04-30T02:12:46.442185-05:00

要控制秒数始终带有三位小数,请使用以下代码:

    DateTimeFormatter formatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss.SSSXXX");
    OffsetDateTime now = OffsetDateTime.now(ZoneId.of("America/Panama"));
    System.out.println(now.format(formatter));

首先,简单版会打印足够的三个小数位组来呈现完全的精度。如果秒数恰好为0.0,则会完全省略秒数。这两种情况都是可行的,因为这些都在ISO 8601格式内允许,而���所要求的格式也是ISO 8601格式。因此,无论谁收到该字符串都应该会很高兴。

请填写您想要的时区,我在示例中使用了美洲/巴拿马。最好给出明确的时区以获得可预测的输出。

我正在使用并推荐java.time,这是现代的Java日期和时间API。您使用的SimpleDateFormat不仅已过时,而且也非���麻烦。java.time与之相比更易于使用。

-05:00是什么意思?

-05:00是与UTC(或GMT,它们几乎是相同的)的偏移量。因此,您的示例字符串可能来自北美东部时区或中美洲或南美洲的其他地方(古巴,玻利维亚等一些在某些季节使用此偏移量的国家)。更准确地说,-05:00表示我们使用的时钟比UTC慢5小时(0分钟)。因此,2:12:46-05:00表示的时间点与7:12:46 UTC相同。如果我们只知道时间是2:12:46而不知道时区或偏移量,那么将会非常模糊。一个偏移量可以完美地将时间转换为一个明确的时间点。

链接


感谢您的解释。 - azaveri7

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接