Редактировать: Ваша строка является строкой-заполнителем
Я считаю, что "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
(и никаких замен после форматирования строки форматером).
Исходный ответ
Это происходит в два этапа:
- Преобразуйте вашу строку в миллисекундах (я полагаю, начиная с эпохи 1970-01-01) в
Instant
. - . Преобразуйте
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.Я нашел бы это намного чище и, в конце концов, легче понять для всех сторон.
Ссылки