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

时间:2011-12-16 09:25:50

标签: ruby-on-rails time localization

我刚刚意识到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"

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

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

看看Mac OS,我确实可以分别选择格式首选项的语言和语言环境,但这就是为什么我们有en-US,en-GB,sv-SE命名,对吧?表示语言 - 国家。我可以将en-SE文件添加到我的应用程序中,包含适合瑞典语的格式的英文翻译。

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

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

2 个答案:

答案 0 :(得分:5)

如果您直接使用%I.%m %p指定时间,则可以获得12小时制:%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"

这适用于Rails 3.1

答案 1 :(得分:3)

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

sv:
  time:
    formats:
      default: "%H:%M"

英语区域设置文件en.yml看起来像

en:
  time:
    formats:
      default: '%I.%m %p'

然后

> I18n.l Time.now, :format => :default, :locale => :en
=> "06.04 PM"
> I18n.l Time.now, :format => :default, :locale => :sv
=> "18:04"