Rails 4用不同的语言解析日期

时间:2013-09-12 12:48:08

标签: internationalization ruby-on-rails-4 rails-i18n

我的用户表单中有text_field :birthday_line,我需要解析用户的birthday属性。 所以我在User课程中做了类似的事情。

attr_accessor :birthday_line
before_save :set_birthday

def set_birthday
  self.birthday = Date.strptime(birthday_line, I18n.translate("date.formats.default")
end

但问题在于,由于某种原因,当我尝试传入字符串Invalid date时,它会向我发送错误27 января 1987 г.,我应该将其解析为1987-01-27。 我的config/locales/ru.yml

中的格式和月份名称
ru:
  date:
    formats:
      default: "%d %B %Y г."
    month_names: [~, января, февраля, марта, апреля, мая, июня, июля, августа, сентября, октября, ноября, декабря]

似乎是正确的。

Date.parse也没有帮助,它只是解析日期编号(27)并将月份和年份放到今天的日期(因此它将是2013年9月27日而不是1987年1月27日)。

1 个答案:

答案 0 :(得分:1)

我遇到了同样的问题以及我的建议:

string_with_cyrillic_date = '27 Января 1987'

1)创建像这样的数组

months = [["января", "Jan"], ["февраля", "Feb"], ["марта", "Mar"], ["апреля", "Apr"], ["мая", "May"], ["июня", "Jun"], ["июля", "Jul"], ["августа", "Aug"], ["сентября", "Sep"], ["октября", "Oct"], ["ноября", "Nov"], ["декабря", "Dec"]]

2)现在你可以迭代这个并找到你的西里尔月:

months.each do |cyrillic_month, latin_month|
  if string_with_cyrillic_date.match cyrillic_month      
    DateTime.parse string_with_cyrillic_date.gsub!(/#{cyrillic_month}/, latin_month) 
  end
end

现在您将收到您期望的日期

27 Jan 1987