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

Java 如何将长本地时间戳转换为字符串UTC时间戳,java,java-8,timezone,timestamp,Java,Java 8,Timezone,Timestamp,与我的答案非常接近,但我发现答案不适合我。我有和你一样长的时间戳 ts = 1362156863140L 因为我认为它是时区朴素的时间戳,对吗?这是科隆当地时间的timestapm-UTC+0200 CET。因此,当我将其转换为字符串时区感知时间戳时,我希望获得: 2013-03-01T14:54:23.140Z 或 我正在使用问题开头的答案中的解决方案: Instant.ofEpochMilli(timestamp).atOffset(ZoneOffset.of("+2")); 返回:

与我的答案非常接近,但我发现答案不适合我。我有和你一样长的时间戳

ts = 1362156863140L

因为我认为它是时区朴素的时间戳,对吗?这是科隆当地时间的timestapm-UTC+0200 CET。因此,当我将其转换为字符串时区感知时间戳时,我希望获得:

2013-03-01T14:54:23.140Z

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

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"));
但结果完全相同。这是一种有用但独创的方法:

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);

你的问题太宽泛了?告诉我们你到底需要什么?如何将这13621568 63140L转换为2013-03-01T14:54:23.140ZAS。我会说相反的。鉴于long不能轻松包含时区信息,因此以这种方式存储它是不可移植的。无论时区如何,长时间戳都必须是即时的,即Unix时间戳。这是输入时间戳值的结果。2013-03-01T21:24:23.140要么你的假设是错误的,要么你的长期价值是错误的。像您这样的长值通常表示自Jamuary 1197000:00UTC纪元以来的毫秒数。通过这种方式理解,您的long值表示2013-03-01T16:54:23.140Z,而不是2013-03-01T14:54:23.140Z表示UTC。如果有人向你提供长期价值观,并打算采用后者,那么他们以非标准的方式行事,必然会引起混乱。如果是这样的话,我不知道他们会如何处理夏季时间,所以我也不能告诉你应该如何处理。我最终使用了:Instant.ofpochmillitimestamp.atOffsetZoneOffset.ofZ.with offsetSamelocalZoneOffset.of+2;但我仍然不知道如何处理夏季。不要依赖三个字母的时区缩写,它们既不标准也不独特。在科隆/科隆的时候,我建议在欧洲/柏林地区。您的代码很好地猜测了如何解释询问者的long值,但我们无法确定。@据我所知,Charlie4fun ZoneDateTime自动处理夏季/冬季时间,但您应该使用ZoneId,而不是像+2这样的偏移量
    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);