Как конвертировать время эпохи в дату и часовой пояс определяется смещением в миллисекундах - PullRequest
0 голосов
/ 26 сентября 2019

Я анализирую одну дату API, связанную с погодным приложением.

Здесь я получаю время в эпоху времени, которое я хочу преобразовать в формат даты и времени.

Я получаю время восхода, котороевремя эпохи.Это 1569494827 (время ввода).Я хочу преобразовать это время в дату.Время смещения в миллисекундах -14400 (смещение в миллисекундах).

Это время по утрам в Нью-Йорке.Вывод будет 06:47, но я не могу перевести это время эпохи в Время вывода

Это ответ: мне нужно конвертировать в дату

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

1 Ответ

1 голос
/ 26 сентября 2019

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);

Вывод:

Восход солнца: 2019-09-26T06: 47: 07-04: 00

Может быть, нет необходимости говорить, что закат происходит таким же образом.

Избегайте java.util.Date

Если по мне нужно преобразовать в Date , выимел в виду java.util.Date: нет.Этот класс плохо спроектирован и давно устарел, а также не может содержать компенсацию.Вам гораздо лучше использовать java.time.Только если вам нужен Date для устаревшего API, который еще не обновлен до java.time, вам нужно выполнить конвертацию.В этом случае вы можете полностью игнорировать смещение («часовой пояс»), поскольку Date все равно не может его учесть.Просто конвертируйте Instant, который мы получили:

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

Как устаревший объект Date: чт 26 сентября 12:47:07 CEST 2019

A Date всегда печатает в часовом поясе JVM по умолчанию, в моем случае - Central European Summer Time (CEST), поэтому мы не получаем 6:47 утра (это довольно раздражает и сбивает с толку).

Вопрос: Могу ли я использовать java.time на Android ниже API уровня 26?

Да, java.time прекрасно работает на старых и новых устройствах Android.Для этого требуется как минимум Java 6 .

  • В Java 8 и более поздних версиях и на более новых устройствах Android (от уровня API 26) современный API поставляется встроенным.В этом случае преобразование: Date.from(sunriseInstant) (немного проще).
  • В Java 6 и 7 получите ThreeTen Backport, бэкпорт современных классов (ThreeTen для JSR 310; см. Ссылки внизу).).
  • На более старых версиях Android используется Android-версия ThreeTen Backport.Это называется ThreeTenABP.И убедитесь, что вы импортируете классы даты и времени из org.threeten.bp с подпакетами.

Ссылки

Table of which java.time library to use with which version of Java or Android.

...