相同的 unixtime 在 joda 中产生与正确日期时间不同的日期时间

Same unixtime yields different date time in joda than the correct date time

我在 Whosebug 上从一个非常古老的 post 那里读到 joda 是转换 Unix 时间戳的可能解决方案。

import org.joda.time._
new DateTime(1511544070).toString("yyyy-MM-dd")

我得到的是 1970-01-18 这个案例,但是,这是错误的,因为日期应该是 根据此在线 converter:11/24/2017 @ 5:21pm (UTC)

在线转换器可能是正确的,因为示例unix时间戳1511544070来自日期范围为2017年11月25日至12月3日的数据集,该数据集来自中国时间比UTC提前8小时,这意味着11/24/2017@5:21pm(UTC)实际为11/25/2017@1:21am(北京时间)

我在哪里可以得到一个工作库或者有一个工作库可以得到与在线转换器相同的结果?

您可以使用 java.time:

import java.time.{ LocalDateTime, ZoneOffset }
import java.time.format.DateTimeFormatter

LocalDateTime.ofEpochSecond(1511544070, 0, ZoneOffset.UTC)
  .format(DateTimeFormatter.ofPattern("yyyy-MM-dd @ h:mm a"))

查看 joda-time 的 documentation,我们看到 DateTime 可以使用 Long 指定自 1 月 1 日以来的 毫秒 1970. 但是,您似乎以秒为单位提供了一个值。 Joda-time 实际上计算正确,因为 1511544070/(1000*3600*24) 等于 17.49 天,即 1970-01-18.

要得到预期的结果乘以 1000:

new DateTime(1511544070*1000).toString("yyyy-MM-dd")

要获取另一个时区的时间,请添加 withZone() 如下(对于 Shanghai/Beijing):

new DateTime(1511544070*1000).toString("yyyy-MM-dd")
  .withZone(DateTimeZone.forID("Asia/Shanghai"))