Как перевести эту строку в формат даты - PullRequest
2 голосов
/ 05 ноября 2011

Я пытался использовать SimpleDateFormat для работы, но я не знаю, как обращаться с буквой T в строке "2008-08-01T15: 47: 00.557", кто-нибудь может мне помочь с этим?

Ответы [ 5 ]

2 голосов
/ 05 ноября 2011

Вам необходимо использовать формат «гггг-ММ-дд'Тхх: мм: сс.ССС».

В дополнительном примечании, если вы пытаетесь обработать даты xml, задайте вопрос: Преобразование даты Java в формат даты XML (и наоборот)

1 голос
/ 05 ноября 2011

Я не очень уверен.Но если я хорошо помню, вы должны окружить букву T одинарными кавычками в вашем формате.

String yourFormat = "yyyy-MM-dd'T'HH:mm:ss.SSS";
0 голосов
/ 07 февраля 2016

ISO 8601

Формат вашей строки соответствует стандарту ISO 8601 .

java.time

Java 8 и более поздние версии включают в себя java.time инфраструктуру для замены старых классов даты и времени, используемых в Вопросе и других Ответах.

Новые классы по умолчанию используют стандарт ISO 8601 при разборе / генерации строк. Так что не нужно указывать шаблон кодированного формата .

Часовой пояс

В вашей входной строке отсутствует часовой пояс или смещение от UTC . Таким образом, вы должны указать часовой пояс, для которого эта строка имеет значение. Если вы не укажете, при разборе автоматически применяется текущий часовой пояс JVM по умолчанию. Не хорошо, так как это значение по умолчанию не может быть зоной, предназначенной для вашей строки. Кроме того, настройки JVM по умолчанию могут измениться в любой момент, даже во время выполнения.

Если UTC

Если ваша строка предназначена для UTC в качестве часового пояса, просто добавьте Z (сокращение от «Zulu», что означает UTC). Затем проанализируйте как Instant, момент времени на UTC.

String input = "2008-08-01T15:47:00.557";
Instant instant = Instant.parse ( input + "Z" );

Дамп на консоль.

System.out.println ( "instant: " + instant );

мгновенный: 2008-08-01T15: 47: 00.557Z

Если часовой пояс

Если ваша строка предназначена для какого-то другого часового пояса, нам нужно указать. Используйте правильное название часового пояса (никогда не используйте 3-4 буквенные коды в прессе). Здесь мы произвольно выбираем часовой пояс Монреаля.

Для шаблона форматирования мы используем один из предопределенных форматов для ISO 8601: DateTimeFormatter.ISO_LOCAL_DATE_TIME («LOCAL» означает отсутствие часового пояса или смещения, встроенных во входную строку).

String input = "2008-08-01T15:47:00.557";
ZoneId zoneId = ZoneId.of ( "America/Montreal" );
DateTimeFormatter formatter = DateTimeFormatter.ISO_LOCAL_DATE_TIME;
formatter = formatter.withZone ( zoneId );
ZonedDateTime zdt = ZonedDateTime.parse ( input , formatter );

Дамп на консоль. Мы также извлекаем Instant из ZonedDateTime, чтобы вы могли увидеть тот же момент в UTC. Обычно лучше всего работать в UTC в своей бизнес-логике; применять только часовой пояс для вывода для пользователя.

System.out.println ( "input: " + input + " | zdt: " + zdt + " | instant of zdt: " + zdt.toInstant () );

ввод: 2008-08-01T15: 47: 00.557 | zdt: 2008-08-01T15: 47: 00.557-04: 00 [Америка / Монреаль] | момент времени от: 2008-08-01T19: 47: 00.557Z

0 голосов
/ 05 ноября 2011

, поскольку ваш пример был в формате 24H, а не в формате AM / PM

вы должны использовать HH (заглавную) вместо hh

как это

String EXT_JS_DATE_FORMAT = "yyyy-MM-dd'T'HH:mm:ss";
0 голосов
/ 05 ноября 2011

SimpleDateFormat sdf = new SimpleDateFormat ("гггг-ММ-дд'Т'ХХ: мм: сс.ССС");

Почти этот точный пример приведен в API, посмотрите его :-)http://download.oracle.com/javase/7/docs/api/java/text/SimpleDateFormat.html

...