【问题标题】:Rails 4 parse a date in a different languageRails 4 用不同的语言解析日期
【发布时间】:2013-09-16 20:50:53
【问题描述】:

我的用户表单中有一个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 г. 时,它给了我一个错误消息Invalid date,它应该被解析为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 日)。

【问题讨论】:

  • I18n.l(user.birthday) 工作正常。所以 i18n 语言环境应该是正确的。
  • 不就是和这个问题一样吗? stackoverflow.com/questions/15531786/…
  • depa:不是真的。我认为我的问题最大的部分是解析月份名称,最小的是格式本身。所以给定的解决方案并不真正适合。我见过delocalize gem,但它仍然不支持 Rails 4。

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


【解决方案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

【讨论】:

    猜你喜欢
    • 2010-10-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-10-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-12
    • 2013-11-24
    相关资源
    最近更新 更多