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

How to print the current time and date in ISO date format in java?

我应该按照下面给出的 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,它表示什么?

在java8中你可以使用新的java.timeapi:

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

简单的解决方案:

    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 格式中被允许。所以无论谁收到了绳子,都应该很高兴。

请填写我使用America/Panama时你想要的时区。最好为可预测的输出提供明确的时区。

我正在使用并推荐 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 而不知道时区或偏移量,那将是非常模糊的。偏移量非常适合将时间转换为明确的时间点。

链接