java zoneddatetime toEpochSecond 不转换为本地时间

java zoneddatetime toEpochSecond without converting to local time

我有一个没有任何夏令时的 EST 时间数据集。 每个日期时间都是从字符串中读取的,并且使用

创建了一个 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 时间戳,以便时间戳与原始字符串中的日期时间相匹配?

I need to convert these to an epoch second but the built in toEpochSecond method converts to my local time which is BST with day light saving. As a result the timestamps are four to five hours off depending on time of year.

你一定是做错了什么。检查下面代码的输出,你会发现没有区别。

import java.time.Instant;
import java.time.ZoneId;
import java.time.ZonedDateTime;
import java.time.format.DateTimeFormatter;
import java.time.format.DateTimeFormatterBuilder;
import java.util.Locale;

public class Main {
    public static void main(String[] args) {
        // Formatter ignoring nanoseconds
        DateTimeFormatter formatter = new DateTimeFormatterBuilder()
                                        .appendPattern("uuuu-MM-dd'T'HH:mm:ssXXX")
                                        .optionalStart()
                                        .appendLiteral('[')
                                        .parseCaseSensitive()
                                        .appendZoneRegionId()
                                        .appendLiteral(']')
                                        .toFormatter(Locale.ENGLISH);

        // The given time-zone
        ZoneId zone = ZoneId.of("America/New_York");

        ZonedDateTime zdtNow = ZonedDateTime.now(zone);
        System.out.println(zdtNow.format(formatter));

        // Epoch seconds from ZonedDateTime
        long epochSecond = zdtNow.toEpochSecond();
        System.out.println(epochSecond);

        // ZonedDateTime from epoch seconds
        ZonedDateTime zdtFromEpochSeconds = Instant.ofEpochSecond(epochSecond).atZone(zone);
        System.out.println(zdtFromEpochSeconds.format(formatter));
    }
}

输出:

2020-09-28T17:31:23-04:00[America/New_York]
1601328683
2020-09-28T17:31:23-04:00[America/New_York]

将 ZonedDateTime 转换为 Unix 纪元时间戳

先转换为java.time.Instant,然后设置zone offset为UTC,再转换为纪元秒,见下:

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

注意:变量zonedDateTime的类型为java.time.ZonedDateTime,在转换为“Unix纪元时间戳”之前可以是任意时区。