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

我应该以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以及它表示什么?

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

 OffsetDateTime now = OffsetDateTime.now(); DateTimeFormatter formatter = DateTimeFormatter.ISO_DATE_TIME; System.out.println(formatter.format(now)); // eg 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 

简易解决方案

  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)); 

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

第一个,简易版本将打印足够的三位小组,以呈现完整的精度。 如果恰好是0.0,它也将完全省去秒。 两者都可能没问题,因为所有这些都是您要求的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表示与UTC时间7:12:46相同的时间点。 如果我们只知道时间是2:12:46并且不知道时区或偏移,那将是非常模糊的。 偏移非常适合将时间转换为明确的时间点。

链接

  • Oracle教程:Date Time解释了如何使用java.time
  • 维基百科文章:ISO 8601
  • 维基百科文章:UTC偏移量