如何使用 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。
这个代码
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。