Мне нужна строка формата для даты, отформатированной следующим образом: 2017-06-14T00:00:00Z.
В настоящее время у меня есть:
DateTimeFormatter DT_SCHEDULE_FORMATTER_START_TIME = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
Если я проанализирую строку 2017-06-14T00:00:00Z с помощью этого, это даст мне правильное время в формате UTC.
Но когда я беру объект DateTime и пытаюсь сделать:
String strNow = new DateTime().toString(DT_SCHEDULE_FORMATTER_START_TIME);
Я получаю что-то вроде 2017-06-14T00:00:00 -07:00
Я просмотрел документацию и не могу найти правильную строку форматирования.
Ответ 1 · рейтинг 2 · Community
Это связано с тем, что конструктор DateTime() использует часовой пояс по умолчанию и шаблон Z в средстве форматирования распечатывает смещение часового пояса.
Смещение часового пояса вашей системы по умолчанию равно -07:00, поэтому вы получаете этот вывод.
Если вам нужен именно вывод с Z в конце, вы должны преобразовать объект DateTime в org.joda.time.Instant:
String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString();
strNow будет 2017-06-14T00:00:00.000Z.
Если вы хотите получить текущее время в UTC (вместо разбора String), вы должны явно указать конструктору DateTime использовать UTC, используя new DateTime(DateTimeZone.UTC).
Приведенный выше код также печатает миллисекунды. Если вы этого не хотите, другой альтернативой является использование DateTimeFormatterBuilder:
DateTimeFormatter formatter = new DateTimeFormatterBuilder()
.appendPattern("yyyy-MM-dd'T'HH:mm:ss")
// append Z if offset is zero (UTC)
.appendTimeZoneOffset("Z", true, 2, 2)
// create formatter
.toFormatter();
String strNow = new DateTime("2017-06-14T00:00:00Z").toInstant().toString(formatter);
Это отформатирует дату согласно (без миллисекунд):
2017-06-14T00:00:00Z
Ответ 2 · рейтинг 1 · rontho
Вы можете попробовать использовать функцию parseDateTime
DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
DateTime dateTime = f.parseDateTime("2017-06-14T00:00:00Z");
Надеюсь, это поможет.
Ответ 3 · рейтинг 1 · DeKaNszn
"Z" в формате - это часовой пояс RFC 822.
Для форматирования, если значение смещения от GMT равно 0, создается "Z". Если количество букв шаблона равно 1, любая часть часа игнорируется.
При синтаксическом анализе "Z" анализируется как обозначение часового пояса UTC. Общие часовые пояса не принимаются.
Если вы хотите получить строку для UTC, вы должны указать часовой пояс:
DateTime dateTime = new DateTime(DateTimeZone.UTC);
String strNow = dateTime.toString(DT_SCHEDULE_FORMATTER_START_TIME);