Как бы вы программно создали шаблон из даты, которая хранится в строке? - PullRequest
6 голосов
/ 04 сентября 2008

У меня есть строка, которая содержит представление даты. Похоже:

Чт 30 ноября 19:00:00 EST 2006

Я пытаюсь создать объект Date, используя SimpleDateFormat, и у меня есть 2 проблемы.

1.) Я не могу понять шаблон для жесткого решения решения в конструкторе SimpleDateFormat

2.) Я не могу найти способ разобрать строку с помощью API для определения шаблона, чтобы я мог использовать его для разных шаблонов вывода даты

Если кто-то знает решение с использованием API или пользовательского решения, я был бы очень признателен.

Ответы [ 11 ]

8 голосов
/ 04 сентября 2008

Формат для передачи в SimpleDateFormat можно найти на http://java.sun.com/javase/6/docs/api/java/text/SimpleDateFormat.html

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy")

Что касается вашего второго вопроса, я не знаю ни одной библиотеки Java, которая могла бы определить формат даты и проанализировать ее, не зная заранее, что это за формат.

3 голосов
/ 09 июля 2009

Анализатор даты POJava org.pojava.datetime.DateTime - это неизменный и надежный анализатор, который поддерживает несколько языков, часовых поясов и форматов.

Лучше всего то, что синтаксический анализатор является эвристическим и не требует предварительно существующего «формата» для работы. Вы просто передаете ему текстовую строку даты / даты и времени и получаете java.util.Date!

2 голосов
/ 05 сентября 2008

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

2 голосов
/ 05 сентября 2008

Стоит знать, что указанный вами формат даты не является произвольным. Это вывод встроенного метода Date.toString () (по крайней мере, в Великобритании и США). Не случайно, это также формат команды date в unix (по крайней мере, в Linux, и я верю и в другие реализации) - хотя, чтобы быть педантичным, Date.toString () дополняет однозначные числа дня нулями дата unix не указана.

Это означает, что вы, вероятно, получите этот формат ввода, когда вы выводите неформатированную дату в поле, изменяемое пользователем (например, в поле HTML INPUT), и получаете его обратно без изменений. Так что если входные данные поступают в этом формате, это не означает, что пользователи будут вводить тысячи других произвольных форматов.

Конечно, они все еще могут. В общем случае я обрабатываю ввод даты с помощью нескольких блоков try / catch, где я пытаюсь использовать один формат, затем другой, затем другой. Наша стандартная структура по умолчанию поддерживает до 20 различных форматов. Конечно, это все еще не идеально; На днях я обнаружил, что кто-то вводит «03 сентября» в качестве даты (нестандартное сокращение месяца без года), и мы не обрабатывали этот сценарий.

2 голосов
/ 04 сентября 2008

Если вы хотите сделать что-то кроме разбора или форматирования даты, то для обработки самих шаблонов не так уж и много. Некоторое время назад я писал компонент Swing для ввода дат в форматированное текстовое поле. Вы указали шаблон, и он переместил курсор ввода текста через элементы этого шаблона, допустив только допустимые значения.

В качестве части этого я написал DateFormatParser , доступный здесь как часть проекта OpenHarmonise с открытым исходным кодом .

Анализ даты в шаблоне был бы чрезвычайно интересной проблемой. Вам нужно будет сделать определенные предположения (например, использовать: по времени, а не по дате), но вы столкнетесь с вечными проблемами, связанными с двузначными числами в формате год / день / месяц или месяц / день.

2 голосов
/ 04 сентября 2008

Я не уверен, что есть какой-то простой способ разобрать дату и определить ее шаблон, но я бы подумал, что шаблон для того, который вы опубликовали, будет:

EEE MMM дд ЧЧ: мм: сс zzz гггг

1 голос
/ 05 сентября 2008

Я должен сказать, что нахожу другой вопрос очень интересным. Хотя есть одна серьезная проблема - разобрать это: 08/07/06! Если вы ограничитесь подмножеством ожидаемых форматов, вы, возможно, сможете решить проблему, поиграв с регулярными выражениями, вы можете создать кучу ожидаемых шаблонов, а затем разбить строки на пробелы или что-то еще и сопоставлять часть за частью.

1 голос
/ 04 сентября 2008

Как уже говорили другие, шаблон выглядит так, как и должно быть

new SimpleDateFormat("EEE MMM dd HH:mm:ss zzz yyyy"

Что касается разбора даты произвольного формата, я не знаю ни одной библиотеки, которая делает это на Java. Если бы вы были заинтересованы в разработке такой вещи, я бы начал с функции perl str2time .

0 голосов
/ 04 сентября 2008

Это не совсем то же самое, но вы можете посмотреть на что-то вроде JChronic , которое может выполнять обработку естественного языка в датах Таким образом, дата ввода может быть чем-то вроде «завтра» или «через две недели со следующего вторника».

Это может совсем не помочь вашему приложению, но, опять же, может.

0 голосов
/ 04 сентября 2008

Как насчет:

EEE MMM dd HH:mm:ss zzz yyyy

Просто передайте строку в конструктор SimpleDateFormat. Чтобы использовать объект, просто вызовите метод parse, передавая строку, которую вы хотите преобразовать в Date.

Вы можете взглянуть на:

http://java.sun.com/j2se/1.4.2/docs/api/java/text/SimpleDateFormat.html

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