从1970年到2020.01.01的毫秒数

我试图从纪元到 2020.01.01 获得毫秒。我对 Date 使用了旧方法,我也想使用新的性感 LocalDate 但我得到的两个结果不同:

long millisecondsInTheDay = 24 * 60 * 60 * 1000;
long millis1 = LocalDate.of(2020, Month.JANUARY, 1).toEpochDay() * millisecondsInTheDay; // 1577836800000
long millis2 = new Date(2020 - 1900, 0, 1).toInstant().toEpochMilli(); // 1577833200000

差异正好是一小时(3600_000 毫秒)。为什么我得到不同的结果?

回答

我不想评论为什么你会有所不同,因为我认为这两种原始方法都有问题。你需要密切关注时区之类的东西;并且您真的应该避免对表示日期的数值进行任何算术运算。

您需要特别注意指定要测量的点:如果您想要毫秒数,大概您真的想将这些点指定为时间瞬间。“1970”不是一瞬间,而是长达一年的时间;“2020-01-01”也不是瞬间,而是一个意义随时区变化的时期——地球上的某个地方大约有 48 小时的瞬间被认为是那个日期。

执行此操作的正确方法(假设您想要在首选时区中的纪元和一天开始之间的毫秒数)是:

Duration between =
    Duration.between(
        Instant.EPOCH,
        LocalDate.of(2020, Month.JANUARY, 1).atStartOfDay(zoneId));

long betweenMillis = between.toMillis(); // If you must - better to keep the type information that this is a Duration.

请注意,您需要指定zoneId,例如ZoneId.of("Europe/Warsaw"),因为这会影响一天的开始时间,以及多少毫秒。


以上是从1970年到2020.01.01的毫秒数的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>