我有一个美国东部时间的数据集,没有任何夏令时。 每个日期时间都是从字符串中读取的,并使用创建 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 时间戳,以便时间戳与原始字符串中的日期时间匹配?
将 ZonedDateTime 转换为 Unix 纪元时间戳
首先转换为 java.time.Instant,然后将区域偏移设置为 UTC,然后再将其转换为纪元秒,请参见下文:
zonedDateTime.toInstant().atZone(ZoneOffset.UTC).toEpochSecond();
注意:变量 zonedDateTime 的类型为 java.time.ZonedDateTime,可以是任何时区,然后将其转换为“Unix 纪元时间戳”(以秒为单位)。
更快的替代方法是避免在此转换期间创建新的
Instant
对象:
ZonedDateTime t = ZonedDateTime.now();
long epochSeconds = t.getLong(ChronoField.INSTANT_SECONDS);
不需要设置 UTC 时区,如其他答案中给出的。
我需要将它们转换为纪元秒,但内置的 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
纪元秒与时区无关。如果您想将纪元秒转换为特定时区的日期时间,您可以显式应用时区,例如
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]
了解有关现代日期时间 API 的更多信息