Java 在时区之间转换历元毫秒

Java 在时区之间转换历元毫秒,java,Java,我得到一个历元格式的数字。Epoch应该是UTC,但我是在PST时区。所以我必须修正这个值。 我该怎么做 我最初尝试的是: //此数字表示2019年7月30日星期二UTC上午1:53:19, //但它应该代表PST。 //此日期的实际PST值将为156446799000 //与2019年7月30日星期二上午8:53:19 UTC相同。 //所以我需要“假装”这个值实际上是PST //并相应调整(包括DST和friends)。 长测试日期长=156445599000L; //这些参数正确地假设该瞬

我得到一个历元格式的数字。Epoch应该是UTC,但我是在PST时区。所以我必须修正这个值。 我该怎么做

我最初尝试的是:

//此数字表示2019年7月30日星期二UTC上午1:53:19,
//但它应该代表PST。
//此日期的实际PST值将为156446799000
//与2019年7月30日星期二上午8:53:19 UTC相同。
//所以我需要“假装”这个值实际上是PST
//并相应调整(包括DST和friends)。
长测试日期长=156445599000L;
//这些参数正确地假设该瞬间为UTC,并将其调整为PST
//这不是真正的意图
LocalDateTime pstL=LocalDateTime.ofInstant(瞬间的Pochmilli(testDateLong)),
“美国/洛杉矶”地区;
ZonedDateTime pstZ=瞬间的ZonedDateTime(瞬间的Pochmilli(testDateLong)),
“美国/洛杉矶”地区;
系统输出打印项次(pstL);
系统输出打印项次(pstZ);
/*
*输出:
*
*2019-07-29T18:53:19
*2019-07-29T18:53:19-07:00[美国/洛杉矶]
* 
*预计将看到:
* 
*2019-07-30T01:53:19
*2019-07-30T01:53:19-07:00[美国/洛杉矶]
* 
*/
工作解决方案是将历元值格式化为UTC格式的字符串,然后使用PST时区对其进行解析,如下所示:

Long testDateLong=156445590000L;
DateTimeFormatter Formatter UTC=DateTimeFormatter
.OfCalizedDateTime(FormatStyle.SHORT)
.withZone(地区名称(“Etc/UTC”);
DateTimeFormatter Formatter PST=DateTimeFormatter
.OfCalizedDateTime(FormatStyle.SHORT)
.withZone(美国/洛杉矶特区);
字符串utcString=formatterUTC.format(Instant.ofEpochMilli(testDateLong));
Instant Instant=Instant.from(formatterPST.parse(utcString));
系统输出打印LN(utcString);
System.out.println(即时);
System.out.println(instant.toEpochMilli());
/*
*输出:
*
*19年7月30日凌晨1:53
*2019-07-30T08:53:00Z
* 1564476780000
*/

然而,对我来说,这似乎是一个糟糕的~ish解决方案(只是一种预感)。我想知道是否还有比生成字符串并对其进行解析更好的方法?

您可以使用
UTC
区域进行解析,然后更改
区域

long testDateLong = 1564451599000L;
Instant ist = Instant.ofEpochMilli(testDateLong);

ZoneId zUTC = ZoneId.of("UTC");
ZoneId zLA = ZoneId.of("America/Los_Angeles");

ZonedDateTime zdt1 = LocalDateTime.ofInstant(ist, zUTC).atZone(zLA);
ZonedDateTime zdt2 = ZonedDateTime.ofInstant(ist, zUTC).withZoneSameLocal(zLA);

System.out.println(zdt1); // 2019-07-30T01:53:19-07:00[America/Los_Angeles]
System.out.println(zdt2); // 2019-07-30T01:53:19-07:00[America/Los_Angeles]