将日期时间分区为EpochSecond,而不转换为本地时间

问题描述 投票:0回答:3

我有一个美国东部时间的数据集,没有任何夏令时。 每个日期时间都是从字符串中读取的,并使用创建 zonedDatetime

ZonedDateTime java.time.ZonedDateTime.of(int year, int month, int dayOfMonth, int hour, int minute, int second, int nanoOfSecond, ZoneId zone)

带有 ZoneId.of("America/New_York");

我需要将它们转换为纪元秒,但内置的 toEpochSecond 方法会转换为我的本地时间,即夏令时 BST。因此,根据一年中的不同时间,时间戳会相差四到五个小时。有没有办法获取不考虑任何本地时间的 unix 时间戳,以便时间戳与原始字符串中的日期时间匹配?

java date java-time epoch zoneddatetime
3个回答
0
投票

将 ZonedDateTime 转换为 Unix 纪元时间戳

首先转换为 java.time.Instant,然后将区域偏移设置为 UTC,然后再将其转换为纪元秒,请参见下文:

zonedDateTime.toInstant().atZone(ZoneOffset.UTC).toEpochSecond();

注意:变量 zonedDateTime 的类型为 java.time.ZonedDateTime,可以是任何时区,然后将其转换为“Unix 纪元时间戳”(以秒为单位)。


0
投票

更快的替代方法是避免在此转换期间创建新的

Instant
对象:

ZonedDateTime t = ZonedDateTime.now();
long epochSeconds = t.getLong(ChronoField.INSTANT_SECONDS);

不需要设置 UTC 时区,如其他答案中给出的。


0
投票

我需要将它们转换为纪元秒,但内置的 toEpochSecond 方法转换为我的本地时间,即 BST 和日期 节省光线。因此,时间戳相差四到五个小时 取决于一年中的时间。

您所说的正确。不管你如何得到结果,它都会保持不变。

您可以尝试不同的方法来获取以下示例的纪元秒

ZonedDateTime
。您总是会得到相同的结果。

class Main {
    public static void main(String[] args) {
        ZoneId zoneId = ZoneId.of("America/New_York");

        // A sample date-time in America/New_York timezone
        ZonedDateTime zdt = ZonedDateTime.of(
                LocalDate.of(2024, Month.DECEMBER, 30),
                LocalTime.of(10, 20, 30),
                zoneId
        );

        long epochSeconds = zdt.toEpochSecond();
        System.out.println(epochSeconds);
    }
}

输出

1735572030

在 Ideone 上尝试一下

纪元秒与时区无关。如果您想将纪元秒转换为特定时区的日期时间,您可以显式应用时区,例如

class Main {
    public static void main(String[] args) {
        Instant instant = Instant.ofEpochSecond(1735572030L);

        System.out.println(ZonedDateTime.ofInstant(instant, ZoneId.of("America/New_York")));
        System.out.println(ZonedDateTime.ofInstant(instant, ZoneId.of("Europe/London")));
        System.out.println(ZonedDateTime.ofInstant(instant, ZoneId.of("Europe/Paris")));
        System.out.println(ZonedDateTime.ofInstant(instant, ZoneId.of("Asia/Kolkata")));
    }
}

输出

2024-12-30T10:20:30-05:00[America/New_York]
2024-12-30T15:20:30Z[Europe/London]
2024-12-30T16:20:30+01:00[Europe/Paris]
2024-12-30T20:50:30+05:30[Asia/Kolkata]

在 Ideone 上尝试一下

Trail:日期时间

了解有关现代日期时间 API 的更多信息
© www.soinside.com 2019 - 2024. All rights reserved.