Java 如何在不改变时间的情况下改变时区?
我有一个时间戳2018-01-01 18:20:23.11,以UTC为单位。我需要以不同的格式打印,但保留UTC时区。但是,如果我使用SimpleDataFormat(“dd-MMM-yyy-yyy-kk:mm-z”),它将获取我当前的时区,并给出2018年1月1日18:20美国东部时间。我想打印2018年1月1日18:20 UTC。执行时区。getTimeZone(“UTC”)将此时间转换为UTC(执行+4到小时),这不是期望的结果Java 如何在不改变时间的情况下改变时区?,java,date,datetime,simpledateformat,Java,Date,Datetime,Simpledateformat,我有一个时间戳2018-01-01 18:20:23.11,以UTC为单位。我需要以不同的格式打印,但保留UTC时区。但是,如果我使用SimpleDataFormat(“dd-MMM-yyy-yyy-kk:mm-z”),它将获取我当前的时区,并给出2018年1月1日18:20美国东部时间。我想打印2018年1月1日18:20 UTC。执行时区。getTimeZone(“UTC”)将此时间转换为UTC(执行+4到小时),这不是期望的结果 DateTimeFormatter original
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)
。我通常使用<代码> ZONEOff.UTC <代码>来表示UTC,并认为这是指定UTC的好的和惯用的方式。但是,对于您的代码,这导致在您请求的UTC
输出中区域被指定为Z
。使用ZoneId.of(“Etc/UTC”)
可以满足您的需求。我找不到其他方法来确保区域的格式为UTC
(在格式模式字符串中保存硬编码UTC
,但这将是一个难看的破解)
顺便说一句,ZoneId.of(“Etc/UTC”).normalized()返回ZoneOffset.UTC
(至少在我的Java10上是这样,但我希望总是这样)
SimpleDataFormat与java.time
SimpleDateFormat
不仅早已过时,而且是出了名的麻烦。我建议你避免这样做。正如您所观察到的,它使用JVM的默认时区是正确的。有一种方法可以说服它采取不同的做法,但我不想费心
java.time
是现代的java日期和时间API。它是在2014年推出的,作为旧的、设计拙劣的日期和时间类的替代品。我觉得和他一起工作会更好
链接:解释如何使用
java.time
请更新您的问题,以显示您在一个应用程序中已经尝试过的内容。有关更多信息,请参见并回答:)参见相关问题,为什么不使用ZoneOffset.UTC
而不是ZoneId.of(“Etc/UTC”)
?有趣的是ZoneOffset.UTC
和ZoneId.of(“Etc/UTC”)
显示了不同的行为。谢谢我建议在你的回答中加上这一点作为一个有趣的提示。