Bezdepbonusu7Программирование: статьи и ответы

Вопрос

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

Автор вопроса: Kristy WelshОтветов: 3

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

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

  • Для будущих посетителей этой страницы: проверьте этот ответ для решения с использованием современной даты и времени API. Arvind Kumar Avinash 11.05.2021

androiddatetime-formatjodatime

Ответы

Ответ 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);

Перевод вопроса и ответов сообщества Stack Overflow, лицензия CC BY-SA. Оригинал на Stack Overflow.

Похожие материалы