8

我的用户表单中有一个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 日)。

4

1 回答 1

2

我有同样的问题,我可以建议:

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
于 2016-11-29T09:30:58.160 回答