如何将纪元时间转换为日期和时区以毫秒为单位的偏移量定义

How do I convert epoch time to date and time zone is defined in offset in millisecond

我正在解析一个与天气应用相关的 api 日期。

这里我得到的是纪元时间,我想转换成日期时间格式。

我正在获取纪元时间的日出时间。是1569494827(输入时间)。 我想把这个时间转换成日期。 它有以毫秒为单位的偏移时间-14400(以毫秒为单位的偏移量)。

这次是纽约早上时间。它的输出将是 06:47 AM 但我无法将这个纪元时间转换为输出时间

这是一个回应:我必须转换成日期

"city": {
        "id": 5128581,
        "name": "New York",
        "coord": {
            "lat": 40.7306,
            "lon": -73.9867
        },
        "country": "US",
        "population": 8175133,
        "timezone": -14400,
        "sunrise": 1569494827,
        "sunset": 1569538053
    }

java.time 和 ThreeTenABP

    int offsetSeconds = -14_400;
    long sunriseSeconds = 1_569_494_827L;

    ZoneOffset offset = ZoneOffset.ofTotalSeconds(offsetSeconds);
    Instant sunriseInstant = Instant.ofEpochSecond(sunriseSeconds);
    OffsetDateTime sunriseDateTime = sunriseInstant.atOffset(offset);
    System.out.println("Sunrise: " + sunriseDateTime);

输出为:

Sunrise: 2019-09-26T06:47:07-04:00

夕阳西下,自不必说。

避免java.util.Date

如果我必须转换成日期你的意思是java.util.Date:不要。 class 设计不佳且早已过时,也无法保持偏移量。你最好使用 java.time。仅当您需要 Date 用于尚未升级到 java.time 的遗留 API 时,您才需要转换。在这种情况下,您可以完全忽略偏移量(“时区”),因为 Date 无法将其考虑在内。只需转换我们得到的Instant

    Date oldfashionedDate = DateTimeUtils.toDate(sunriseInstant);
    System.out.println("As old-fashioned Date object: " + oldfashionedDate);

As old-fashioned Date object: Thu Sep 26 12:47:07 CEST 2019

A Date 总是在 JVM 的默认时区打印,在我的例子中是中欧夏令时 (CEST),这就是为什么我们在早上没有得到 6:47(这是一种非常烦人和令人困惑的行为。

问题:我可以在 API 26 级以下的 Android 上使用 java.time 吗?

是的,java.time 在新旧 Android 设备上都能很好地工作。它只需要至少 Java 6.

  • 在 Java 8 及更高版本和较新的 Android 设备上(从 API 级别 26),现代 API 是内置的。在这种情况下,转换为:Date.from(sunriseInstant)(更简单一些)。
  • 在 Java 6 和 7 中获取 ThreeTen Backport,现代 classes 的 backport(ThreeTen 用于 JSR 310;请参阅底部的链接)。
  • 在(较旧的)Android 使用 ThreeTen Backport 的 Android 版本。它叫做 ThreeTenABP。并确保使用子包从 org.threeten.bp 导入日期和时间 classes。

链接