Как бы вы программно создали шаблон из даты, которая хранится в строке?
Вопрос
У меня есть строка, которая содержит представление даты.Это выглядит так:
Чт, 30 ноября, 19:00:00 по восточному времени 2006
Я пытаюсь создать объект Date с помощью SimpleDateFormat и сталкиваюсь с двумя проблемами.
1.) Я не могу найти шаблон для жесткого кодирования решения в конструкторе SimpleDateFormat
2.) Я не могу найти способ, которым я мог бы проанализировать строку с помощью API для определения шаблона, чтобы я мог повторно использовать это для разных шаблонов вывода даты
Если кто-нибудь знает решение, использующее API или пользовательское решение, я был бы очень признателен.
Решение
Формат для передачи в SimpleDateFormat можно посмотреть по ссылке http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")
Что касается вашего второго вопроса, я не знаю ни одной библиотеки Java, которая определяла бы формат даты и анализировала его, не зная заранее, что это за формат.
Другие советы
Анализатор даты POJava org.pojava.datetime.DateTime - это неизменяемый и надежный анализатор, который поддерживает несколько языков, часовых поясов и форматов.
Лучше всего то, что анализатор является эвристическим и не требует для работы уже существующего "формата”.Вы просто передаете ему текстовую строку date / дата-время и получаете java.util.Date!
Я не уверен, что есть какой-либо простой способ проанализировать дату и определить ее шаблон, но я бы подумал, что шаблон для того, который вы опубликовали, будет следующим:
ЭЭЭ МММ дд ЧЧ:мм: сс ззз гггг
Если вы хотите сделать что-либо другое, кроме синтаксического анализа или форматирования даты, там не так много возможностей для обработки самих шаблонов.Некоторое время назад я писал Swing-компонент для ввода дат в форматированное текстовое поле.Вы указали шаблон, и он перемещал курсор ввода текста по элементам этого шаблона, допуская только допустимые значения.
В рамках этого я написал DateFormatParser доступно здесь в рамках проекта OpenHarmonise с открытым исходным кодом.
Преобразование даты в шаблон было бы чрезвычайно интересной задачей для решения.Вам пришлось бы сделать определенные предположения (например,использование :во времени, а не в дате), но вы столкнулись бы с вечными проблемами, связанными с 2-значными годами и порядком день / месяц или месяц / день.
Стоит знать, что указанный вами формат даты не является произвольным.Это результат встроенного метода Date.toString() (по крайней мере, в локализациях Великобритании и США).Не случайно, что это также формат команды unix 'date' (по крайней мере, в linux, и я верю, что в других реализациях тоже) - хотя, если быть педантичным, Date.toString() дополняет однозначные номера дней нулем, в то время как unix date этого не делает.
Это означает, что вы, скорее всего, получите этот формат ввода при выводе неформатированной даты в поле, изменяемое пользователем (напримерполе ввода HTML) и получите его обратно без изменений.Таким образом, только потому, что входные данные поступают в этом формате, не означает, что пользователи будут вводить текст в тысяче других произвольных форматов.
Конечно, они все еще могут это сделать.Способ, которым я обрабатываю ввод даты в целом, - это набор блоков try / catch, где я пробую его в одном формате, затем в другом, затем в другом.В настоящее время наша стандартная платформа по умолчанию содержит около 20 различных форматов.Конечно, это все еще не идеально;На днях я обнаружил, что кто-то вводит "03 сентября" в качестве даты (нестандартная аббревиатура месяца без указания года), и мы не рассматривали этот сценарий.
Смотрите Apache Commons' DateUtils - Файлы данных.Там есть parseDate
метод, который требует вашего String
и несколько шаблонов, которые нужно попробовать и выплюнуть Date
пример.
Как уже говорили другие, шаблон выглядит так, как и должен быть
new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"
Что касается синтаксического анализа даты в произвольном формате, я не знаю ни одной библиотеки, которая делала бы это на Java.Если бы вы хотели разработать подобную вещь, я бы начал с изучения perl str2time функция.
Я должен сказать, что нахожу другой вопрос очень интересным.Однако есть одна серьезная проблема - проанализируйте это:08/07/06!Если вы ограничиваете себя подмножеством ожидаемых форматов, вы, вероятно, могли бы решить проблему, поиграв с регулярными выражениями, вы могли бы создать кучу ожидаемых шаблонов, а затем разбивать строки на пробелы или что-то еще и сопоставлять часть за частью.
Вы просто спрашиваете шаблон для данной даты?Если это так, я думаю, что это должно сработать:
"EEE MMM d HH:mm:ss z yyyy"
Или вы пытаетесь взять любую отформатированную дату, вывести формат и проанализировать его?
Как насчет:
EEE MMM dd HH:mm:ss zzz yyyy
Просто передайте строку в конструктор SimpleDateFormat.Чтобы использовать объект, просто вызовите метод parse, передающий строку, которую вы хотите преобразовать в Дату.
Вы могли бы взглянуть на:
http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html
На самом деле это не одно и то же, но вы, возможно, захотите взглянуть на что-то вроде Хронический, который может выполнять обработку данных на естественном языке.Таким образом, дата ввода может быть чем-то вроде "завтра" или "через две недели после следующего вторника".
Это может совсем не помочь вашему приложению, но, опять же, это возможно.