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

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

Чт, 30 ноя, 19:00:00 EST 2006

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

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

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

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

К вашему сведению, неприятные старые классы даты и времени, такие как java.util.Date, java.util.Calendar и java.text.SimpleTextFormat, теперь являются наследие, вытесненными классами java.time. См. Учебник от Oracle.

Basil Bourque 22.07.2017 03:47
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
6
1
2 409
11
Перейти к ответу Данный вопрос помечен как решенный

Ответы 11

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

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

Спасибо! Этот шаблон работает, лучшее, что я смог найти с помощью Google, - это «ддд МММ дд чч: мм: сс 'EST' гггг», которое генерировало исключение ParseException. Надеюсь, есть способ программно определить шаблон.

Aaron 04.09.2008 18:23

Вы просто спрашиваете образец для этой даты? Если так, я думаю, это должно сработать:

"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), это может привести к сбою в результате выдачи исключения и т. д. Это не идеальное решение, но его было бы достаточно разумно использовать в большинстве ситуаций.

Aaron 05.09.2008 01:26

Стоит знать, что указанный вами формат даты не является произвольным. Это результат встроенного метода 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!

Другие вопросы по теме