如何在不更改时间的情况下更改时区?
How to change timezone without changing the time?
我有一个 UTC 时间戳 2018-01-01 18:20:23.11。我需要以不同的格式打印它,但保留 UTC 时区。但是,如果我使用 SimpleDateFormat ("dd MMM YYYY yyyy kk:mm z"),它会占用我当前的时区并给我 2018 年 1 月 1 日 18:20 EST。我希望它打印 2018 年 1 月 1 日 18:20 UTC。执行 Timezone.getTimeZone("UTC") 会将此时间转换为 UTC(将 +4 转换为小时),这不是所需的结果。
DateTimeFormatter originalFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SS");
DateTimeFormatter newFormatter
= DateTimeFormatter.ofPattern("dd MMM uuuu HH:mm z", Locale.ENGLISH);
String originalTimestamp = "2018-01-01 18:20:23.11";
String differentFormat = LocalDateTime.parse(originalTimestamp, originalFormatter)
.atZone(ZoneId.of("Etc/UTC"))
.format(newFormatter);
System.out.println(differentFormat);
这会打印
01 Jan 2018 18:20 UTC
ZoneId.of("Etc/UTC")
或 ZoneOffset.UTC
?
可能是书呆子式的编辑:我首先在转换中写了 .atZone(ZoneOffset.UTC)
。我通常使用 ZoneOffset.UTC
来表示 UTC 并认为这是指定它的良好且惯用的方式。但是,对于您的代码,这会导致区域在您要求 UTC
的输出中被指定为 Z
。使用 ZoneId.of("Etc/UTC")
代替会给你你想要的。我找不到其他方法来确保该区域被格式化为 UTC
(在格式模式字符串中保存硬编码 UTC
,但这将是一个丑陋的 hack)。
顺便说一句 ZoneId.of("Etc/UTC").normalized()
returns ZoneOffset.UTC
(至少在我的 Java 10 上是这样,但我希望情况总是如此)。
SimpleDateFormat 与 java.time
SimpleDateFormat
不仅早已过时,而且出了名的麻烦。我建议你避免它。正如您所观察到的,它使用 JVM 的默认时区是正确的。有一种方法可以说服它做不同的事情,但我不会费心。
java.time
是现代 Java 日期和时间 API。它于 2014 年问世,取代了设计不佳的旧日期和时间 类。恕我直言,与它一起工作要好得多。
Link: Oracle tutorial: Date Time 解释如何使用 java.time
我有一个 UTC 时间戳 2018-01-01 18:20:23.11。我需要以不同的格式打印它,但保留 UTC 时区。但是,如果我使用 SimpleDateFormat ("dd MMM YYYY yyyy kk:mm z"),它会占用我当前的时区并给我 2018 年 1 月 1 日 18:20 EST。我希望它打印 2018 年 1 月 1 日 18:20 UTC。执行 Timezone.getTimeZone("UTC") 会将此时间转换为 UTC(将 +4 转换为小时),这不是所需的结果。
DateTimeFormatter originalFormatter
= DateTimeFormatter.ofPattern("uuuu-MM-dd HH:mm:ss.SS");
DateTimeFormatter newFormatter
= DateTimeFormatter.ofPattern("dd MMM uuuu HH:mm z", Locale.ENGLISH);
String originalTimestamp = "2018-01-01 18:20:23.11";
String differentFormat = LocalDateTime.parse(originalTimestamp, originalFormatter)
.atZone(ZoneId.of("Etc/UTC"))
.format(newFormatter);
System.out.println(differentFormat);
这会打印
01 Jan 2018 18:20 UTC
ZoneId.of("Etc/UTC")
或 ZoneOffset.UTC
?
可能是书呆子式的编辑:我首先在转换中写了 .atZone(ZoneOffset.UTC)
。我通常使用 ZoneOffset.UTC
来表示 UTC 并认为这是指定它的良好且惯用的方式。但是,对于您的代码,这会导致区域在您要求 UTC
的输出中被指定为 Z
。使用 ZoneId.of("Etc/UTC")
代替会给你你想要的。我找不到其他方法来确保该区域被格式化为 UTC
(在格式模式字符串中保存硬编码 UTC
,但这将是一个丑陋的 hack)。
顺便说一句 ZoneId.of("Etc/UTC").normalized()
returns ZoneOffset.UTC
(至少在我的 Java 10 上是这样,但我希望情况总是如此)。
SimpleDateFormat 与 java.time
SimpleDateFormat
不仅早已过时,而且出了名的麻烦。我建议你避免它。正如您所观察到的,它使用 JVM 的默认时区是正确的。有一种方法可以说服它做不同的事情,但我不会费心。
java.time
是现代 Java 日期和时间 API。它于 2014 年问世,取代了设计不佳的旧日期和时间 类。恕我直言,与它一起工作要好得多。
Link: Oracle tutorial: Date Time 解释如何使用 java.time