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

StackOverflow https://stackoverflow.com/questions/43842

  •  09-06-2019
  •  | 
  •  

Вопрос

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

Чт, 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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top