根据当前语言环境在Rails中显示小时格式(am/pm或不是)

Mar*_*tin 1 time localization ruby-on-rails

我刚刚意识到Rails(目前3.1.3)中的l(或localize)方法似乎不能根据当前设置的语言环境管理时钟格式.我刚刚假设这是这种情况,并没有特别针对此进行测试...我刚刚验证了日期是根据语言环境重新格式化的.

我在我的rails控制台中获得了24小时的全部时钟.两个语言环境之间唯一可见的区别是月份名称的大写.

I18n.l Time.now, :format => :short,  :locale => :"en"
I18n.l Time.now + 12.hours, :format => :short,  :locale => :"en"
I18n.l Time.now, :format => :short,  :locale => :"sv-SE"
I18n.l Time.now + 12.hours, :format => :short,  :locale => :"sv-SE"
Run Code Online (Sandbox Code Playgroud)

现在,为什么呢?这不是本地化时间的一部分吗?

我发现AM/PM的唯一手动干预是生成表格的选择,我可以"手动"要求12小时时钟.一个奇怪的选择,因为我觉得我只想要依赖于语言环境的那种东西.

看看Mac OS,我确实可以单独选择格式首选项的语言和区域设置,但这就是为什么我们有en-US,en-GB,sv-SE命名,对吧?表示语言 - 国家.我可以通过格式化在瑞典的格式将en-SE文件添加到包含英语翻译的应用程序中.

我假设并非所有美国开发人员都进入并编辑英语的默认语言环境文件(en-US看起来与en btw相同),以获得适合美国用户的12小时时钟.所以,请随时告诉我我是多么愚蠢.我完全相信这个问题确实是非常基本的.

简而言之.我错了什么?我如何"修复"我的时间戳?:)

0x4*_*672 5

如果您直接指定时间,则可以获得12小时制%I.%m %p:%p表示指示符("AM"或"PM"),%I表示12小时制时钟中的小时数(01..12)

>> I18n.l Time.now, :format => "%I.%m %p",  :locale => :"en"
=> "01.12 pm"
>> I18n.l Time.now + 12.hours, :format => "%I.%m %p",  :locale => :"en"
=> "01.12 am"
Run Code Online (Sandbox Code Playgroud)

这适用于Rails 3.1


0x4*_*672 5

当然,您可以根据当前区域设置显示小时格式(上午/下午或不),例如,如果您在不同的语言/区域设置文件中定义不同的时间格式。请记住,日期和时间格式之间存在差异,如果您使用Time.now,则使用时间格式(如果您使用 Date 值或 typecast to_date,则使用日期格式)。瑞典文件sv.yml看起来像

sv:
  time:
    formats:
      default: "%H:%M"
Run Code Online (Sandbox Code Playgroud)

英语语言环境文件en.yml看起来像

en:
  time:
    formats:
      default: '%I.%m %p'
Run Code Online (Sandbox Code Playgroud)

然后

> I18n.l Time.now, :format => :default, :locale => :en
=> "06.04 PM"
> I18n.l Time.now, :format => :default, :locale => :sv
=> "18:04"
Run Code Online (Sandbox Code Playgroud)