3

我的 Android 应用程序与一个 API 通信,它给了我以下时间戳:-2209161600。转换为日期时间,它应该是12-30-1899 00:00:00

问题是,我尝试使用默认库、threetenbp 和 jodatime 转换此时间戳,但使用Europe/Paristimezone 时总是得到相同的错误结果:12-30-1899 00:09:21

为什么会这样?

编辑:例如与 jodatime

DateTime dt = new DateTime(-2209161600000L, DateTimeZone.forID("Europe/Paris")); // dt: "1899-12-30T00:09:21.000+00:09:21"
4

2 回答 2

2

我想我在常见问题解答中找到了答案,为什么时区的偏移量与 JDK 不同?

...在引入现代时区系统之前影响日期时间。时区数据是从时区数据库中获取的。该数据库包含有关“本地平均时间”(LMT)的信息,这是在太阳运动之后在该位置观察到的本地时间。

Joda-Time 在某个位置选择第一个时区偏移之前的所有时间都使用 LMT 信息。...

换句话说,该数据库没有该时间的条目,因此它使用本地标准时间(例如,巴黎为 0:09:21,或马德里1为 -0:14:44 )。

System.out.println(new DateTime(-2209161600000L, DateTimeZone.forID("Europe/Paris")));
System.out.println(new DateTime(-2209161600000L, DateTimeZone.forID("Europe/Madrid")));

将打印

1899-12-30T00:09:21.000+00:09:21
1899-12-29T23:45:16.000-00:14:44

解决方案:取决于需要什么时间,如果 UTC 足够,请使用

new DateTime(-2209161600000L, DateTimeZone.forID("UTC"))  // 1899-12-30T00:00:00.000Z

或者只是标准java.time

Instant.ofEpochSecond(-2209161600L)
Instant.ofEpochMilli(-2209161600000L)

1 - http://home.kpn.nl/vanadovv/time/TZworld.html#eur

于 2019-08-02T14:14:58.947 回答
1

Carlos Heuberger 可能已经说过了。据我所知,这是使用 UTC 而不是欧洲/巴黎时区的问题。

    long unixTimestamp = -2_209_161_600L;
    Instant inst = Instant.ofEpochSecond(unixTimestamp);
    System.out.println("As Instant: " + inst);

输出是:

即时:1899-12-30T00:00:00Z

如果您需要日期和时间:

    OffsetDateTime dateTime = inst.atOffset(ZoneOffset.UTC);
    System.out.println("As OffsetDateTime: " + dateTime);

作为偏移日期时间:1899-12-30T00:00Z

我错过了什么吗?

解释

为什么这有关系?因为在 1899 年,巴黎使用的是巴黎的当地平均时间,与 UTC 相差 +00:09:21。因此,欧洲/巴黎时区的正确和预期结果是您得到的结果,12-30-1899 00:09:21。要检查此偏移量:转到法国 Île-de-France 的巴黎时区。在Time zone changes for下拉列表中选择 1850 – 1899。您将看到 +00:09:21 的偏移量在整个时间间隔内有效(在 1891 年更改时区缩写之前和之后)。

于 2019-08-04T09:59:33.367 回答