4

我有一个日期,当它用作英语时效果很好

> Date.strptime("Aug 02, 2015", "%b %d, %Y")
Sun, 02 Aug 2015

但是,当我使用另一种语言es时,它不起作用。例如

> 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"
4

2 回答 2

1

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

@date = Date.parse("ago 02, 2015") 

除此之外,您可以尝试附加到日期常量,以便正确获取它们。个人没有尝试过这种方法,但可能对你有用?

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 )

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

于 2017-09-07T23:36:01.140 回答
0

您可以先用英语替换西班牙语单词。您可以使用#gsubI18n 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"
于 2017-09-07T23:22:09.333 回答