Разобрать дату в рельсах

У меня есть дата (которая на самом деле анализируется из PDF-файла), и она может быть любого из следующих форматов:

MM/DD/YYYY
MM/DD/YY
M/D/YY
October 15, 2007
Oct 15, 2007 

Есть ли какой-либо драгоценный камень или функция, доступная в rails или ruby, для анализа моей даты? Или мне нужно разобрать его с помощью регулярного выражения?

Кстати, я использую рубин на рельсах 3.2.


person Sachin Prasad    schedule 10.07.2013    source источник


Ответы (2)


Вы можете попробовать Date.parse(date_string).

Вы также можете использовать Date#strptime, если вам нужно определенный формат:

> Date.strptime("10/15/2013", "%m/%d/%Y")
=> Tue, 15 Oct 2013

Для общего решения:

format_str = "%m/%d/" + (date_str =~ /\d{4}/ ? "%Y" : "%y")
date = Date.parse(date_str) rescue Date.strptime(date_str, format_str)
person Chris Heald    schedule 10.07.2013
comment
Я не могу использовать strptime, так как не знаю формат своей даты :( - person Sachin Prasad; 10.07.2013
comment
Вы могли бы сделать вывод это достаточно легко, не так ли? Если он не будет анализироваться с помощью Date.parse, тогда split(/).last будет состоять из 2 или 4 символов, сообщая вам, следует ли использовать %y или %Y. - person Chris Heald; 10.07.2013
comment
Итак, что делает ваш метод, так это то, что если он не может разобрать американский формат, он просто передаст его в strptime. Я думаю, что это сработает, позвольте мне протестировать его. - person Sachin Prasad; 10.07.2013
comment
Верный. Есть несколько способов сделать это; мой небрежный, но эффективный. :) - person Chris Heald; 10.07.2013
comment
Большую часть времени моя дата будет в американском формате, и если дата меньше 12, Date.parse будет анализировать ее, считая ее месяцем. Как насчет Date.strptime(date_str, format_str) save Date.parse(date_str)? - person Sachin Prasad; 10.07.2013
comment
Стоит попробовать. Найдите то, что работает для вас — между этими двумя методами вы должны быть в состоянии обрабатывать все эти форматы даты. - person Chris Heald; 10.07.2013
comment
Я проверил после реверсирования (Date.strptime (date_str, format_str) save Date.parse (date_str)) и отлично работает. Большинство дат у меня есть, он может их проанализировать. Большое спасибо за помощь, пожалуйста, отредактируйте свой ответ, и я приму его. - person Sachin Prasad; 10.07.2013

Я считаю, что хронический драгоценный камень очень прост в использовании для анализа времени, и он должен работать для вас. Я попробовал примеры, которые вы привели.

https://github.com/mojombo/chronic

person beanie    schedule 10.07.2013
comment
Кажется, это хорошо для обработки сложных дат, есть ли возможность указать, что мои даты будут в формате ММ/ДД/ГГГГ, а не в формате ДД/ММ/ГГГГ? - person Sachin Prasad; 10.07.2013
comment
это должно быть по умолчанию, но вы можете установить такой порядок байтов endian_precedence: :little, и он будет анализировать ДД/ММ/ГГГГ - person beanie; 10.07.2013