Несовместимый разбор дат с использованием SimpleDateFormat

java date simpledateformat date-parsing

9826 просмотра

4 ответа

293895 Репутация автора

Я действительно почесал голову от этого. Я использовал SimpleDateFormats без проблем некоторое время, но теперь, использование SimpleDateFormat для анализа дат (только иногда) просто неправильно.

В частности:

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
Date date = sdf.parse("2009-08-19 12:00:00");
System.out.print(date.toString());

печатает строку Wed Aug 19 00:00:00 EDT 2009. Какого черта? - он даже не разбирается в неправильную дату все время!


Обновление: это исправило это красиво. Разве вы не знаете, это неправильно использовалось и в нескольких других местах. Должен любить отладку чужого кода :)

Автор: Matt Ball Источник Размещён: 21.08.2009 05:37

Ответы (4)


2 плюса

75414 Репутация автора

Вы печатаете представление даты toString (), а не представление формата. Вы также можете проверить представление часов. Н и ч означают что-то другое. H - для 24-часовых часов (0-23), h - для 12-часовых часов (1-12), (также есть k и K для времен 1-24 и 0-11 соответственно)

Вам нужно сделать что-то вроде:

//in reality obtain the date from elsewhere, e.g. new Date()
Date date = sdf.parse("2009-08-19 12:00:00"); 

//this format uses 12 hours for time
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss");
//this format uses 24 hours for time
SimpleDateFormat sdf2 = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");

System.out.print(sdf.format(date));
System.out.print(sdf2.format(date));
Автор: Rich Seller Размещён: 21.08.2009 05:40

25 плюса

35101 Репутация автора

Решение

Я думаю, что вы хотите использовать HHформат, а не «чч», чтобы вы использовали часы между 00-23. «чч» принимает формат с шагом 12 часов, и поэтому он предполагает, что он находится в AM.

Так это

SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
Date date = sdf.parse("2009-08-19 12:00:00");
System.out.print(date.toString());

Следует распечатать

Ср 19 августа 12:00:00 ПО ВОСТОЧНОМУ ВРЕМЕНИ 2009

Автор: Rob Di Marco Размещён: 21.08.2009 05:43

3 плюса

1269 Репутация автора

Час должен быть указан как ЧЧ вместо ЧЧ. Ознакомьтесь с разделом «Шаблоны даты и времени» в http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

Автор: Thimmayya Размещён: 21.08.2009 05:49

1 плюс

140577 Репутация автора

ТЛ; др

LocalDateTime ldt = LocalDateTime.parse( "2009-08-19 12:00:00".replace( " " , "T" ) );

java.time

Другие ответы верны, но используют устаревшие классы даты и времени. Эти неприятные старые классы были вытеснены классами java.time.

Ваша входная строка близка к стандартному формату ISO 8601 . Твик, заменив пространство в середине с T. Затем его можно проанализировать без указания шаблона форматирования. Классы java.time по умолчанию используют ISO 8601 при разборе / генерации строк.

String input = "2009-08-19 12:00:00".replace( " " , "T" );

Входные данные не содержат информации о смещении от UTC или часовом поясе. Так что разбираем как LocalDateTime.

LocalDateTime ldt = LocalDateTime.parse( input );

Если по контексту вы знаете предполагаемое смещение, примените его. Возможно, он был предназначен для UTC (смещение нуля), где мы можем использовать константу ZoneOffset.UTC.

OffsetDateTime odt = ldt.atOffset( ZoneOffset.UTC );

Или, может быть, вы знаете, что он предназначен для определенного часового пояса. Часовой пояс - это смещение плюс набор правил для обработки аномалий, таких как переход на летнее время (DST).

ZonedDateTime zdt = ldt.atZone( ZoneId.of( "America/Montreal" ) );

О java.time

Java.time каркас встроен в Java 8 и более поздних версий. Эти классы вытеснять старые классы хлопотно даты и времени , такие как java.util.Date, .Calendar, и java.text.SimpleDateFormat.

Проект Joda-Time , находящийся сейчас в режиме обслуживания , рекомендует перейти на java.time.

Чтобы узнать больше, см. Учебник по Oracle . И поиск переполнения стека для многих примеров и объяснений.

Большая часть функциональности java.time перенесена на Java 6 и 7 в ThreeTen-Backport и дополнительно адаптирована для Android в ThreeTenABP (см. Как использовать… ).

Проект ThreeTen-Extra расширяет java.time дополнительными классами. Этот проект является полигоном для возможных будущих дополнений к java.time.

Автор: Basil Bourque Размещён: 20.08.2016 06:44
Вопросы из категории :
32x32