【问题标题】:How to convert a localized string date to Ruby Date object?如何将本地化字符串日期转换为 Ruby Date 对象?
【发布时间】:2017-09-07 21:35:20
【问题描述】:

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

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

【问题讨论】:

  • 您是否正在寻找一种完全与语言无关的解决方案,以便它适用于所有人或仅适用于英语?

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


【解决方案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 类。
  • 您是否尝试过我建议的其他选项?
  • Date.parse 不采用非英文月份名称。另一个也不起作用(至少在 Rails 控制台上),当然还有它的覆盖常量 - 不好的做法
【解决方案2】:

您可以先用英语替换西班牙语单词。您可以使用#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"

【讨论】:

  • 不理想,但这几乎是我所使用的,除了不需要字典本身。由于这是 rails 使用区域设置键作为月份名称
猜你喜欢
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 2020-02-03
  • 2014-09-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多