Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/303.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何在不改变时间的情况下改变时区?_Java_Date_Datetime_Simpledateformat - Fatal编程技术网

Java 如何在不改变时间的情况下改变时区?

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

我有一个时间戳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 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”)
显示了不同的行为。谢谢我建议在你的回答中加上这一点作为一个有趣的提示。