Подтвердить что ты не робот

Есть ли хороший парсер для Java?

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

Например

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

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

4b9b3361

Ответ 2

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

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

Ответ 3

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

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

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

Ответ 4

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

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

Ответ 5

ТЛ; др

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 для поля YEAR.


О 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 и другие.

Ответ 6

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

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

Proj: POJava Документы: HOWTO использует DateTime

Ответ 7

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

Ответ 8

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

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

Ответ 9

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

Ответ 10

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