Разбор даты и времени, который принимает 05.05.1999 и 05.05.1999 и т. Д. - PullRequest
4 голосов
/ 23 октября 2008

Есть ли простой способ анализа даты, который может быть в ММ / ДД / гггг, или М / Д / гггг, или в какой-то комбинации? то есть ноль необязателен перед числом или месяцем, состоящим из одной цифры.

Чтобы сделать это вручную, можно использовать:

String[] dateFields = dateString.split("/");
int month = Integer.parseInt(dateFields[0]);
int day = Integer.parseInt(dateFields[1]);
int year = Integer.parseInt(dateFields[2]);

И подтвердить с помощью:

dateString.matches("\\d\\d?/\\d\\d?/\\d\\d\\d\\d")

Есть ли вызов SimpleDateFormat или JodaTime, который бы справился с этим?

Ответы [ 3 ]

11 голосов
/ 23 октября 2008

Да, используйте setLenient:

DateFormat df = new SimpleDateFormat("MM/dd/yyyy");
df.setLenient(true);
System.out.println(df.parse("05/05/1999"));
System.out.println(df.parse("5/5/1999"));
2 голосов
/ 29 октября 2015

java.time

Java 8 и более поздние версии включают инфраструктуру java.time. Эта структура устаревает старые классы java.util.Date/.Calendar, обсужденные в других ответах здесь.

Пакет java.time.format и его класс java.time.format.DateTimeFormatter используют коды шаблонов, аналогичные кодам, принятым в принятом Ответе Рэя Майерса. Хотя они и похожи, они немного различаются. В частности, они строги в отношении количества повторяющихся символов. Если вы скажете MM, то месяц должен быть дополнен нулем, иначе вы получите DateTimeParseException . Если номер месяца может иметь или не иметь дополняющий ноль, просто используйте одиночный символ M.

В этом примере кода обратите внимание, что номер месяца во входной строке имеет нулевой отступ, а номер дня месяца - нет. Оба обрабатываются односимвольным шаблоном.

DateTimeFormatter formatter = DateTimeFormatter.ofPattern ( "M/d/yyyy" );
LocalDate localDate = formatter.parse ( "01/2/2015" , LocalDate :: from );

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

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

localDate: 2015-01-02

1 голос
/ 23 октября 2008

Похоже, моей проблемой было использование "MM / DD / yyyy", когда я должен был использовать "MM / dd / yyyy". Прописные буквы D - это «День в году», а строчные буквы d - «День в месяце».

new SimpleDateFormat("MM/dd/yyyy").parse(dateString);

делает работу. Также «М / Д / У» работает взаимозаменяемо. Более подробное чтение документов SimpleDateFormat API показывает следующее:

«При разборе число букв шаблона игнорируется, если только это не необходимо для разделения двух смежных полей.»

...