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

5

当我使用英语时,我的日期可以正常工作。

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

你是在寻找一种完全与语言无关的解决方案,以便它适用于所有语言,还是只适用于英语? - chris-tulip
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进行日期解析了吗?我相信它应该能够处理跨语言情况。

尝试过Chronic,但它不支持i18n,因为它使用了Ruby的Time类。 - absessive
你尝试过我建议的另外两个选项之一吗? - chris-tulip
1
Date.parse 不接受非英语月份名称。 另一个也不起作用(至少在Rails控制台中),而且它重写了常量 - 这是一种不好的做法。 - absessive

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"

重构它以充分利用面向对象编程的优势:

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"

不是最理想的,但这几乎是我采用的方法,除了不需要字典本身。由于这是Rails,使用区域设置键来表示月份名称。 - absessive

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