Разбор дат в формате Rails - PullRequest
       19

Разбор дат в формате Rails

9 голосов
/ 26 февраля 2010

У меня есть партия из примерно 100 тысяч записей, которые я импортирую в приложение Rails.

В каждой строке есть дата, отформатированная следующим образом: 03/17/81

Однако, когда я пытаюсь просто присвоить его полю даты, оно конвертируется следующим образом:

ruby-1.8.7-p174 > "03/17/81".to_date
 => Sat, 17 Mar 0081 

В конечном счете, я бы хотел, чтобы формат получился 1981-03-17

Это лучше всего сделать при импорте, или я должен переопределить в моей конфигурации Rails, чтобы установить стандарт даты на нужный мне формат и каков правильный подход в Rails 2.3.5?

Ответы [ 4 ]

19 голосов
/ 26 февраля 2010

Использование

d = Date.strptime("03/17/81", "%m/%d/%y")

Чтобы получить его в 1981-03-17, используйте:

d.to_s

См. Дата Рубидок .

3 голосов
/ 26 февраля 2010

Правильный способ сделать это, если вы собираетесь повторно использовать формат в нескольких местах, это сделать что-то вроде этого: http://seanbehan.com/ruby-on-rails/custom-date-formats-for-your-rails-application/

Создать файл config/initializers/date_formats.rb

... содержащий это:

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
  :short_date => "%Y/%m/%d"
)

Тогда вы должны увидеть:

ruby-1.8.7-p174 > date = "03/17/81".to_date
ruby-1.8.7-p174 > date.to_s(:short_date)
#=> "1981/03/17"
1 голос
/ 26 февраля 2010

Попробуйте Chronic (Gem Install Хронический):

require 'rubygems'
require 'chronic'
puts Chronic.parse "03/17/81"
#=> Tue Mar 17 12:00:00 -0800 1981

Возвращает объект Time.

0 голосов
/ 26 февраля 2010

Не меняйте Rails, меняйте свой код. Я не вижу проблем в создании метода, который преобразует строку в подходящую дату.

string = "03/17/81"
date   = if string =~ %r{(\d+)/(\d+)/(\d+)}
  Date.parse("19#{$3}-#{$1}-#{$2}")
else
  nil # failover
end
...