gpt4 book ai didi

java - 如何将长本地时间戳转换为字符串 UTC 时间戳

转载 作者:行者123 更新时间:2023-12-02 11:11:32 29 4
gpt4 key购买 nike

This question与我的非常接近,但是我发现答案不适合我。我的时间戳为 Long。

ts = 1362156863140L

由于它很长,我认为它是时区天真的时间戳,对吗?现在是 科隆 本地时间 - UTC+0200 (CET)。因此,当我将其转换为字符串时区感知时间戳时,我想获得:

2013-03-01T14:54:23.140Z

2013-03-01T16:54:23.140+02:00

我正在使用问题开头答案中的解决方案:

Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.of("+2"));

返回:

2013-03-01T18:54:23.140+02:00

另一个时区:

Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.of("Z"));

返回:

2013-03-01T16:54:23.140Z

所以这些方法并没有真正改变时区,它们只是改变时间戳的表示。我还尝试了另一种方法:

OffsetDateTime.ofInstant(Instant.ofEpochMilli(timestamp), ZoneId.of("UTC"));

但是结果是完全一样的。 This solutions很有用,但原始的方法:

int offset = TimeZone.getTimeZone("Europe/Amsterdam").getRawOffset();
long newTime = timestamp - offset;

不考虑夏季/冬季时间。建议的答案使用 Calendar 类,该类对于 JDK8 来说已过时。有效且显而易见的是:

OffsetDateTime.ofInstant(Instant.ofEpochMilli(Timestamp), ZoneId.of("UTC")).minusSeconds(7200);

但这显然不是执行此操作的正确方法,那么我该如何使用时区来做到这一点?

最佳答案

我认为时间戳采用 UTC 格式,您需要将时间戳更改为 CET。看看 withZoneSameInstant() 方法,可能会有所帮助。

    long timeStamp = 1362156863140L;
ZoneId sourceZone = ZoneId.of("UTC");
ZoneId targetZone = ZoneId.of("CET");
String s = ZonedDateTime.ofInstant(Instant.ofEpochMilli(timeStamp), sourceZone)
.withZoneSameLocal(targetZone)
.toString();
System.out.println(s);

关于java - 如何将长本地时间戳转换为字符串 UTC 时间戳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50584469/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com