Rails 4如何解析不同语言的日期?

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

但问题是,出于某些原因,当我尝试传递字符串27 января 1987 г.(应解析为1987-01-27)时,它会给我一个错误,显示Invalid date

在我的config/locales/ru.yml中,日期格式和月份名称为:

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

似乎是正确的。

Date.parse也没有帮助,它只解析了日期中的天数(27),并将月份和年份设置为今天的日期(所以它将会是2013年9月27日而不是1987年1月27日)。


I18n.l(user.birthday) 能够正常工作。因此,i18n 语言环境应该是正确的。 - Almaron
这不就是同一个问题吗?https://dev59.com/H2Up5IYBdhLWcg3wF0dq#15607550 - Marcelo De Polli
2
depa: 不太是。我认为我问题的最大部分在于解析月份名称,最小的部分则关于格式本身。所以给出的解决方案并不真正适用。我见过delocalize gem,但它仍不支持Rails 4。 - Almaron
1个回答

3
我有同样的问题,我能提供以下建议:
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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接