У меня есть строка, содержащая представление даты. Это выглядит как:
Чт, 30 ноя, 19:00:00 EST 2006
Я пытаюсь создать объект Date с помощью SimpleDateFormat и имею 2 проблемы.
1.) Я не могу понять шаблон для жесткого кодирования решения в конструкторе SimpleDateFormat.
2.) Я не могу найти способ проанализировать строку с помощью API, чтобы определить шаблон, чтобы я мог повторно использовать его для разных шаблонов вывода даты.
Если кто-то знает решение, использующее API или индивидуальное решение, я был бы очень признателен.




Я не уверен, что есть какой-то простой способ проанализировать дату и определить ее шаблон, но я бы подумал, что шаблон для той, которую вы опубликовали, будет:
EEE MMM дд ЧЧ: мм: сс zzz гггг
Спасибо! Этот шаблон работает, лучшее, что я смог найти с помощью Google, - это «ддд МММ дд чч: мм: сс 'EST' гггг», которое генерировало исключение ParseException. Надеюсь, есть способ программно определить шаблон.
Вы просто спрашиваете образец для этой даты? Если так, я думаю, это должно сработать:
"EEE MMM d HH:mm:ss z yyyy"
Или вы пытаетесь взять любую отформатированную дату, вывести формат и проанализировать его?
Формат, передаваемый в SimpleDateFormat, можно найти в http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")
Что касается вашего второго вопроса, я не знаю какой-либо библиотеки Java, которая могла бы определить формат даты и проанализировать его, не зная заранее, что это за формат.
Как говорили другие, шаблон выглядит так, как будто он должен быть
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"
Что касается синтаксического анализа даты в произвольном формате, я не знаю ни одной библиотеки, которая делает это на Java. Если бы вы хотели разработать такую вещь, я бы начал с рассмотрения функции perl str2time.
Как насчет:
EEE MMM dd HH:mm:ss zzz yyyy
Просто передайте строку в конструктор SimpleDateFormat. Чтобы использовать объект, просто вызовите метод синтаксического анализа, передав строку, которую вы хотите преобразовать в Date.
Вы можете взглянуть на:
http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
Если вы хотите сделать что-либо, кроме синтаксического анализа или форматирования даты, для обработки самих шаблонов не так много возможностей. Некоторое время назад я писал компонент Swing для ввода дат в форматированное текстовое поле. Вы предоставили шаблон, и он перемещал курсор ввода текста через элементы этого шаблона, допуская только допустимые значения.
В рамках этого я написал DateFormatParser доступен здесь как часть проекта с открытым исходным кодом OpenHarmonise.
Разбор даты в шаблоне было бы чрезвычайно интересной задачей. Вам придется сделать определенные допущения (например, использовать: in time, not date), но вы столкнетесь с вечными проблемами двухзначного числа лет и даты / месяца или месяца / дня.
На самом деле это не то же самое, но вы можете посмотреть что-то вроде JChronic, которое может обрабатывать естественный язык по датам. Таким образом, дата ввода может быть чем-то вроде «завтра» или «две недели со следующего вторника».
Это может совсем не помочь вашему приложению, но, опять же, может.
Я должен сказать, что мне очень интересен другой вопрос. Однако есть одна серьезная проблема - проанализируйте это: 07.08.06! Если вы ограничиваете себя подмножеством ожидаемых форматов, вы, вероятно, могли бы решить проблему, играя с регулярными выражениями, вы могли бы создать кучу ожидаемых шаблонов, а затем разбить строки на пробелы или что-то еще и сопоставить по частям.
Согласен, двусмысленность есть, это самая частая проблема с финиками. Однако одним из решений может быть передача программному методу шаблона по умолчанию, например mm-dd-yy, который он будет использовать в случае обнаружения неоднозначной даты. Если для этого параметра не задано значение по умолчанию (null), это может привести к сбою в результате выдачи исключения и т. д. Это не идеальное решение, но его было бы достаточно разумно использовать в большинстве ситуаций.
Стоит знать, что указанный вами формат даты не является произвольным. Это результат встроенного метода Date.toString () (по крайней мере, в Великобритании и США). Не случайно, это также формат команды unix 'date' (по крайней мере, в Linux, и я верю и в другие реализации) - хотя, чтобы быть педантичным, Date.toString () дополняет однозначные числа дня нулем, а дата unix нет.
Это означает, что вы, вероятно, получите этот формат ввода, когда вы выведете неформатированную дату в поле, изменяемое пользователем (например, поле HTML INPUT), и получите его обратно без изменений. То, что ввод поступает в этом формате, не означает, что пользователи будут вводить тысячу других произвольных форматов.
Конечно, все еще могут. Обычно я обрабатываю ввод даты с помощью кучи блоков try / catch, где я пробую использовать один формат, затем другой, затем другой. Наша стандартная структура теперь по умолчанию поддерживает около 20 различных форматов. Конечно, это все еще не идеально; На днях я обнаружил, что кто-то ввел «03 сентября» в качестве даты (нестандартное сокращение месяца и без года), и мы не справились с этим сценарием.
Смотрите Apache Commons 'DateUtils. Существует метод parseDate, который использует ваш String и несколько шаблонов, чтобы попытаться выплюнуть экземпляр Date.
Синтаксический анализатор даты POJava org.pojava.datetime.DateTime - это неизменяемый и надежный синтаксический анализатор, который поддерживает несколько языков, часовых поясов и форматов.
Лучше всего то, что синтаксический анализатор является эвристическим и не требует для работы уже существующего «формата». Вы просто передаете ему текстовую строку даты / даты и времени и получаете java.util.Date!
К вашему сведению, неприятные старые классы даты и времени, такие как
java.util.Date,java.util.Calendarиjava.text.SimpleTextFormat, теперь являются наследие, вытесненными классами java.time. См. Учебник от Oracle.