Ответ 1
Проверьте Joda Time и его причудливые форматеры.
Java 8 включает в себя JSR-310, так что это может быть решением.
Кто-нибудь знает хороший синтаксический анализатор для разных языков/локалей. Встроенный парсер Java (SimpleDateFormat) очень строгий. Он должен заполнить недостающие части с текущей датой.
Например
Изменить: я хочу проанализировать ввод от пользователя. Например, если формат даты локали пользователя "dd.mm.yyyy", а пользовательский тип - "12.11". то парсер должен принять это как действительную дату со значением "12.11.2008". Цель - хорошее использование.
Проверьте Joda Time и его причудливые форматеры.
Java 8 включает в себя JSR-310, так что это может быть решением.
Из 43642, хотя и не обязательно дубликат:
См. Apache Commons DateUtils. Там parseDate
метод, который принимает ваши String
и несколько шаблонов, чтобы попробовать и выплескивает экземпляр Date
.
(Отредактировано для ясности.)
Лично я считаю, что строгий - это хорошо. Так много разных ситуаций требуют разных правил в отношении упрощенного синтаксического анализа, и невозможно полностью интегрировать их в общую библиотеку.
Тем не менее, я бы настоятельно рекомендовал Joda Time вместо встроенных классов даты/времени в целом. Их форматеры и парсеры являются поточно-ориентированными и неизменяемыми, что также помогает. У Joda Time есть некоторая поддержка для беспрепятственного разбора, как показано в другом ответе, но вы должны ожидать, что вам придется предоставить некоторые правила самостоятельно.
Я бы сказал JChronic, если вы ищете что-то, что будет анализировать даты из естественного "нечеткого" человеческого ввода.
Я с успехом использовал JChronic и Chronic (оригинальная версия Ruby).
java.time.format.DateTimeFormatterBuilder::parseDefaulting
Класс 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 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
и другие.
Проект POJava на SourceForge имеет объект DateTime, который анализирует даты с нескольких языков (когда месяц указан как имя) и настраивается между MM-DD-YYYY и DD-MM-YYYY. Он анализирует даты эвристически, выбирая наиболее вероятный год, месяц, дату, час, минуту, секунду и часовой пояс, а не поддерживает предопределенные форматы. Файл jar имеет размер около 60K.
Существует двусмысленность в интерпретации даты типа "10-08" в том смысле, что ее можно было бы назвать сокращением либо "2008-10-08", либо "Oct 2008". Вы можете добавить год самостоятельно, если принимаете вид сокращений, который вы даете в своем примере.
Proj: POJava Документы: HOWTO использует DateTime
Использовать DateFormat... Текущий стандарт до тех пор, пока не будет отложено приветствие Joda.
Календарь, как правило, подходит, но следует понимать, что большая часть управления датами Java будет обрабатываться с вашей стороны, если вы хотите, чтобы все было сделано правильно. Часовой пояс - это хорошая вещь, если вам нужно управлять международной информацией или информацией между зонами. Joda Time также полезна и является источником вдохновения для новых предлагаемых концепций даты/времени, которые будут добавлены в Java в JSR 310.
Надеюсь, это полезно.
Я попытался реализовать расширяемый PHP strtotime
в Java в этом ответе
Я бы сказал +1 для JodaTime. В дополнение к разбору, Джода делает почти каждую операцию, связанную с датой.