Я пытаюсь получить DateTimeFormatter для строки даты во времени joda.

Мне нужна строка формата для даты, отформатированной следующим образом: 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

Я просмотрел документацию и не могу найти правильную строку форматирования.


person Kristy Welsh    schedule 07.07.2017    source источник
comment
Для будущих посетителей этой страницы: проверьте этот ответ для решения с использованием современной даты и времени API.   -  person Arvind Kumar Avinash    schedule 11.05.2021


Ответы (3)


Это связано с тем, что конструктор 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

person Community    schedule 07.07.2017

Вы можете попробовать использовать функцию parseDateTime

DateTimeFormatter f = DateTimeFormat.forPattern("yyyy-MM-dd'T'HH:mm:ssZ");
DateTime dateTime = f.parseDateTime("2017-06-14T00:00:00Z");

Надеюсь, это поможет.

person rontho    schedule 07.07.2017

«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);
person DeKaNszn    schedule 07.07.2017