有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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

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

ts = 1362156863140L
因为我认为它是时区朴素的时间戳,对吗?它是科隆当地时间的timestapm-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);

但从防御性的角度来看,这不是一种正确的方法,所以我如何在时区内做到这一点呢


共 (1) 个答案

  1. # 1 楼答案

    我假设时间戳在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);