如何使用 Java 中的 String.format 将当前系统日期时间格式化为 UTC?

How do you format current system datetime as UTC using String.format in Java?

这个代码

String.format("%1$tY%1$tm%1$td", new Date());

使用当前系统时间给出 YYYYmmdd 格式,但时区也是当前系统默认值。如何让这段代码给出 UTC 日期?

我试过了

String.format("%1$tY%1$tm%1$td", Date.from(LocalDateTime.now().atZone(ZoneId.of("UTC")).toInstant()));

但不工作。

使用ZonedDateTime:

ZonedDateTime zonedDateTime = ZonedDateTime.now().withZoneSameInstant(ZoneId.of("UTC"));
System.out.println(String.format("%1$tY%1$tm%1$td", zonedDateTime));

由于您只需要显示年、月和日,最合适的 class 应该是 LocalDate. Also, I suggest you use DateTimeFormatter,它不仅专门用于格式化日期、时间,而且 time-zone 信息以及许多其他功能,例如将 date-time 的部分默认为某些值、本地化等

import java.time.LocalDate;
import java.time.ZoneOffset;
import java.time.format.DateTimeFormatter;

public class Main {
    public static void main(String[] args) {
        // Today at UTC
        LocalDate date = LocalDate.now(ZoneOffset.UTC);

        // Define the formatter
        DateTimeFormatter formatter = DateTimeFormatter.ofPattern("uuuuMMdd");

        // Display LocalDate in its default format
        System.out.println(date);

        // Display LocalDate in the custom format
        System.out.println(date.format(formatter));
    }
}

输出:

2020-09-11
20200911

请注意 java.util.Date 不代表 Date/Time 对象。它只是代表没有。从 1970-01-01T00:00:00Z 纪元算起的毫秒数。它没有任何 time-zone 或 zone-offset 信息。当您打印它时,Java 打印通过将基于您的 JVM 的 time-zone 的日期和时间与您的 JVM 的 time-zone 组合得到的字符串。来自 java.util 的日期和时间 API 大部分已被弃用并且 error-prone。我建议你停止使用 java.util.Date 并切换到 java.time API.

java.time API 有一组丰富的 class 用于不同的目的,例如如果您需要有关日期和时间的信息,您可以使用 LocalDateTime,如果您需要有关日期和时间的信息,并且 time-zone,您可以使用 ZonedDateTime 或 [=22] =].以下 table 显示 java.time 包中可用的 overview of date-time classes

详细了解 the modern date-time API from Trail: Date Time