конвертировать миллисекунды в дату Java со смещением часов (Z05: 00) - PullRequest
0 голосов
/ 19 сентября 2018

Как преобразовать строковое значение в миллисекундах в строку формата даты как "2006-01-02T15:04:05Z07:00"?(включая смещение по Z) * ​​1002 *

1 Ответ

0 голосов
/ 19 сентября 2018

Редактировать: Ваша строка является строкой-заполнителем

Я считаю, что "2006-01-02T15:04:05Z07:00" - это способ Голанга указать формат даты и времени.Точнее, формат ISO 8601.Фактически отформатированная строка будет выглядеть, например, как 2018-09-19T00:26:42-05:00.Поэтому используйте DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ssXXX") или просто DatetimeFormatter.ISO_OFFSET_DATE_TIME (и никаких замен после форматирования строки форматером).

Исходный ответ

Это происходит в два этапа:

  1. Преобразуйте вашу строку в миллисекундах (я полагаю, начиная с эпохи 1970-01-01) в Instant.
  2. . Преобразуйте Instant в нужный часовой пояс и отформатируйте его.

Задача со вторым шагом.Смещения имеют знаки, положительные или отрицательные, и стандартные параметры форматирования для смещений включают - или + (за исключением того, что нулевое смещение иногда записывается как просто Z без знака).Вот мой пример:

    ZoneId zone = ZoneId.of("America/Denver");
    DateTimeFormatter firstShotFormatter
            = DateTimeFormatter.ofPattern("uuuu-MM-dd'T'HH:mm:ss'Z'xxx");

    String milliseconds = "1136239445000";

    Instant pointInTime = Instant.ofEpochMilli(Long.parseLong(milliseconds));
    String firstShot = pointInTime.atZone(zone).format(firstShotFormatter);
    // Offset should be negative
    if (firstShot.contains("Z-")) {
        // Remove minus sign from formatted offset
        String result = firstShot.replace("Z-", "Z");
        System.out.println("Formatted string: " + result);
    } else {
        throw new IllegalStateException(
                "Don’t know how to format a positive offset from UTC");
    }

Вывод этого фрагмента:

Форматированная строка: 2006-01-02T15: 04: 05Z07: 00

Я предположил, что ваше смещение Z07:00 относится к Североамериканскому горному времени, которое в январе составляет -07: 00.Пожалуйста, проверьте.Я не знал, как обрабатывать положительное смещение, поэтому мой код проверяет, что это не происходит.

Я нахожу формат, который вы просили, своеобразным.Он соответствует ISO 8601 с характеристикой T между датой и временной частью.Но, насколько мне известно, ISO 8601 будет иметь смещение в виде либо Z (для нуля) или со знаком, например, -07:00, никогда не является смесью из них.Вы можете проверить, можете ли вы убедить получателя вашей отформатированной строки принять вместо нее прямую строку ISO 8601.Я нашел бы это намного чище и, в конце концов, легче понять для всех сторон.

Ссылки

...