我在美国,我们通常将日期格式设置为“月/日/年”。我正在努力确保使用Ruby 1.9的Rails应用程序在任何地方都采用这种格式,并按照它在Ruby 1.8下的方式工作。
我知道很多人都有这个问题,所以我想在这里创建一个明确的指南。
具体做法是:
我该怎么做?
这是我到目前为止所拥有的。
我在application.rb
:
# Format our dates like "12/25/2011'
Date::DATE_FORMATS[:default] = '%m/%d/%Y'
这确保了如果我执行以下操作:
d = Date.new(2011,4,1)
d.to_s
...我得到“04/01/2011”,而不是“2011-04-01”。
ActiveSupport的String#to_date
方法目前看起来像这样(source):
def to_date
return nil if self.blank?
::Date.new(*::Date._parse(self, false).values_at(:year, :mon, :mday))
end
(如果你没有遵循这一点,第二行创建一个新的日期,按年顺序传递年,月和日。它获取年,月和日值的方式是使用{{1解析一个字符串并以某种方式决定这些值是什么,然后返回一个哈希值。Date._parse
按照.values_at
想要的顺序从该哈希值中提取值。)
因为我知道我通常会传递像“04/01/2011”或“4/1/2011”这样的字符串,所以我可以通过monkeypatching来解决这个问题:
Date.new
此解决方案使我的测试通过,但它是疯了吗?我在某处错过了配置选项,还是有其他更简单的解决方案?
我还没有其他任何日期解析案例吗?
答案 0 :(得分:9)
这个宝石是在我问这个问题后创建的。我现在正在使用它并且很高兴。
答案 1 :(得分:2)
Date.strptime
可能就是你在ruby 1.9中寻找的东西。
你现在可能已经把它monkeypatching到string.to_date,但strptime是解析ruby 1.9中字符串日期的最佳解决方案。
另外,据我所知,格式与strftime对称。
答案 2 :(得分:2)
您可以使用rails-i18n gem或仅复制en-US.yml并在config / application.rb中设置默认语言环境“en-US”
答案 3 :(得分:2)
要解析美式日期,您可以使用:
Date.strptime(date_string, '%m/%d/%Y')
在控制台中:
> Date.strptime('04/01/2011', '%m/%d/%Y')
=> Fri, 01 Apr 2011
> Date.strptime('4/1/2011', '%m/%d/%Y')
=> Fri, 01 Apr 2011
答案 4 :(得分:0)
使用REE? :d
但是说真的。如果这是一个小应用程序,您可以完全控制或者您正在标准化该日期格式,猴子修补项目是完全合理的。您只需要确保所有输入都以正确的格式输入,无论是通过API还是网站。
答案 5 :(得分:0)
不要使用to_s for Date实例,而是养成使用strftime的习惯。它需要一个格式字符串,使您可以完全控制日期格式。
编辑: strptime通过指定格式字符串使您可以完全控制解析。您可以在两种方法中使用相同的格式字符串。
答案 6 :(得分:0)
另一种选择是慢性病 - http://chronic.rubyforge.org/
您只需将字节序首选项设置为仅强制使用MM / DD / YYYY日期格式:
Chronic::DEFAULT_OPTIONS[ :endian_precedence ] = [ :middle ]
然而,Chronic的默认值是无序的美国日期格式!