如何将本地化的字符串日期转换为Ruby Date对象?

时间:2017-09-07 21:35:21

标签: ruby-on-rails rails-i18n i18n-gem

我的日期在使用英语

时效果很好
> Date.strptime("Aug 02, 2015", "%b %d, %Y")
Sun, 02 Aug 2015

然而,当我使用另一种语言es时,这不起作用。 E.g。

> Date.strptime("ago 02, 2015", "%b %d, %Y")
ArgumentError: invalid date

文本字符串ago 02, 2015本身来自另一个服务,我需要将其标准化为特定格式,例如

> I18n.localize(Date.strptime("Aug 02, 2015", "%b %d, %Y"), format:  "%m/%d/%Y")
"08/02/2015"

有没有办法在Ruby中执行此操作,以便

> I18n.localize(Date.strptime("ago 02, 2015", "%b %d, %Y"), format:  "%m/%d/%Y")
"08/02/2015"

2 个答案:

答案 0 :(得分:0)

您可以先用英语替换西班牙语单词。您可以使用#gsub,I18n yaml查找或字典方法来执行此操作,例如

dictionary = { "ago" => "Aug" }
date = "ago 02, 2015"
words = date.split
words[0] = dictionary[words[0]]
date = words.join(" ")  # "Aug 02, 2015"

重构它以利用OOP的力量:

class DateDictionary 
  LOOKUP = { "ene" => "Jan", "ago" => "Aug" }

  def translate(date)
    words = date.split
    words[0] = LOOKUP[words[0]]
    date = words.join(" ")
  end
end

date = DateDictionary.new.translate("ago 02, 2015")  #  "Aug 02, 2015"

答案 1 :(得分:0)

我假设您已经尝试过以下功能,该功能可以处理将某些内容转换为DateTime对象的大多数情况。

require 'date'
Date::MONTHNAMES      = [nil] + %w( Enero Febrero Marzo Abril Mayo Junio Julio Agosto Septiembre Octubre Noviembre Diciembre )
Date::DAYNAMES        = %w( Lunes Martes Miércoles Jueves Viernes Sábado Domingo )
Date::ABBR_MONTHNAMES = [nil] + %w( Ene Feb Mar Abr May Jun Jul Ago Sep Oct Nov Dic )
Date::ABBR_DAYNAMES   = %w( Lun Mar Mié Jue Vie Sáb Dom )

除此之外,您可以尝试附加日期常量,以便正确地选择它们。个人避风港试过这种方法,但可能对你有用吗?

NSNotificationCenter

最后,您是否考虑过使用Chronic Gem进行日期解析?我相信它应该处理跨语言案件。