Есть ли хороший анализатор дат для Java? - PullRequest
23 голосов
/ 21 октября 2008

Кто-нибудь знает хороший парсер дат для разных языков / локалей? Встроенный синтаксический анализатор Java (SimpleDateFormat) очень строг. Следует заполнить недостающие части с текущей датой.

Например

  • если я не введу год (только день и месяц), следует использовать текущий год.
  • если год 08, то он не должен анализировать 0008, потому что шаблон текущего года имеет 4 цифры.

Редактировать: я хочу проанализировать ввод от пользователя. Например, если языковой формат даты пользователя - «dd.mm.yyyy», а пользователь вводит только «12.11». тогда синтаксический анализатор должен принять это как действительную дату со значением "12.11.2008". Цель - хорошее удобство использования.

Ответы [ 10 ]

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

Проверьте Joda Time и его причудливые Форматеры .

Java 8 включает JSR-310 , что также может быть решением.

13 голосов
/ 21 октября 2008

С 43642 , хотя необязательно дубликат:

См. Apache Commons ' DateUtils . Существует метод parseDate, который использует ваши String и несколько шаблонов, чтобы попытаться выплюнуть экземпляр Date.

8 голосов
/ 21 октября 2008

(отредактировано для ясности.)

Лично я думаю, что строгий - это хорошо. Так много разных ситуаций требуют разных правил в отношении упрощенного синтаксического анализа, и невозможно полностью интегрировать это в общую библиотеку.

Однако я настоятельно рекомендую Joda Time вместо встроенных классов даты / времени в целом. Их форматеры и парсеры являются поточно-ориентированными и неизменяемыми, что также помогает. У Joda Time есть некоторая поддержка для беспрепятственного разбора, как показано в другом ответе, но вы должны ожидать, что вам придется предоставить некоторые правила самостоятельно.

3 голосов
/ 24 мая 2018

ТЛ; др

java.time.format.DateTimeFormatterBuilder::parseDefaulting

java.time

Класс DateTimeFormatter разбирает строки на объекты даты и времени.

Вы можете создавать настраиваемые экземпляры DateTimeFormatter, используя класс DateTimeFormatterBuilder. Этот класс компоновщика позволяет указывать значения по умолчанию для отсутствующих компонентов входной строки.

DateTimeFormatter f =
        new DateTimeFormatterBuilder()
                .appendPattern( "MM-dd" )
                .parseDefaulting(
                        ChronoField.YEAR ,
                        ZonedDateTime.now( ZoneId.of( "America/Montreal" ) ).getYear()
                )
                .toFormatter() ;

String input = "01-23" ;
LocalDate ld = LocalDate.parse( input , f ) ;

System.out.println( ld ) ;

ld.toString (): 2018-01-23

См. Также DateTimeFormatterBuilder с указанными конфликтами parseDefaulting для поля ГОД .


О java.time

Фреймворк java.time встроен в Java 8 и более поздние версии. Эти классы вытесняют старые классные устаревшие классы даты и времени, такие как java.util.Date, Calendar, & SimpleDateFormat.

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

Чтобы узнать больше, см. Oracle Tutorial . И поиск переполнения стека для многих примеров и объяснений. Спецификация JSR 310 .

Вы можете обмениваться java.time объектами напрямую с вашей базой данных. Используйте драйвер JDBC , совместимый с JDBC 4.2 или более поздней версии. Нет необходимости в строках, нет необходимости в java.sql.* классах.

Где получить классы java.time?

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

3 голосов
/ 22 октября 2008

Я бы сказал JChronic , если вы ищете что-то, что будет анализировать даты из естественного "нечеткого" человеческого ввода.

Я с большим успехом использовал JChronic и Chronic (оригинальная версия Ruby).

2 голосов
/ 13 декабря 2008

Проект POJava в SourceForge имеет объект DateTime, который анализирует даты из нескольких языков (если месяц указан как имя) и настраивается между MM-DD-YYYY и DD-MM-YYYY. Он анализирует даты эвристически, выбирая наиболее вероятный год, месяц, дату, час, минуту, секунду и часовой пояс, а не поддерживает предопределенные форматы. Размер файла JAR составляет около 60 КБ.

Существует некоторая двусмысленность в интерпретации даты, такой как «10-08», в том смысле, что она может быть обозначена как сокращение для «2008-10-08» или «Октябрь 2008». Вы можете добавить год самостоятельно, если вы согласны с сокращением, которое вы даете в своем примере.

Proj: POJava Документы: КАК использовать DateTime

1 голос
/ 13 августа 2009

Я пытался реализовать в этом ответе расширяемый PHP strtotime в Java

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

Календарь - это, как правило, путь, но следует понимать, что большинство функций управления датами Java будут обрабатываться с вашей стороны, если вы хотите, чтобы все было сделано правильно. Часовой пояс - это хорошая вещь для изучения, если вам приходится управлять международной / межзональной информацией. Joda Time также является изящной вещью и вдохновляет новые предлагаемые концепции даты / времени, которые будут добавлены в Java в JSR 310 .

Надеюсь, это полезно.

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

Использовать DateFormat ... Текущий стандарт до приветственной отсрочки Joda.

0 голосов
/ 21 октября 2008

Я бы сказал +1 для JodaTime. В дополнение к синтаксическому анализу, Joda делает каждую операцию, связанную с датами, лучше.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...