【问题标题】:Change default Ruby Time format更改默认 Ruby 时间格式
【发布时间】:2011-01-12 23:23:32
【问题描述】:

我一直不得不将“.strftime("%H:%M")”附加到任何在我的 Rails 项目中显示时间的内容。我对每个 Concert 对象都有一个开始时间和一个结束时间,所以每当我想显示这些时间时,我都必须附加“.strftime("%H:%M")”。

请注意,我并不是要更改日期格式。日期看起来不错(如 MM/DD/YYYY)。

解决此问题的最佳方法是什么?有没有办法设置默认时间格式?

(我很确定这只是一个 Ruby 的东西,但我是新手,所以我不确定。)

【问题讨论】:

  • 请允许我建议您不要使用 MM/DD/YYYY 作为您的日期格式,除非您的网站非常明确地仅供美国用户使用。它通常是模棱两可的(例如 2011 年 1 月 2 日),世界其他大部分地区都使用 DDMMYYYY。最好为月份使用(可能是短的)名称。
  • 注意!尽管我在美国,但我个人自己使用 DD/MM/YYYY,但这个项目是为一个非常非常小的聚会准备的,他们都来自美国并使用 MM/DD 约定。

标签: ruby-on-rails


【解决方案1】:

由于您使用的是 Rails,请利用 I18n 支持:http://guides.rubyonrails.org/i18n.html#adding-date-time-formats

# config/locales/en.yml
en:
  time:
    formats:
      default: "%H:%M"

然后当您调用I18n.l Time.now<%= l Time.now %> 时,它会自动使用该格式。

【讨论】:

  • 所以,我可能遗漏了一些东西,但我已将其添加到 yml 文件中,但尚未看到更改。我正在运行 Rails 2.3.8,我记得在阅读敏捷书之前遇到过国际化问题。我可以获得一些翻译的唯一方法是使用 t 方法。根据我的阅读,翻译应该是自动的。我可能做错了什么?
  • 这可能看起来很傻,但是您是否重新启动了服务器?我不认为翻译文件会自动重新加载。如果是这样,请仔细检查语法。 YAML 对缩进非常讲究。最后,尝试明确指定“默认”以确保文档在此行为中不正确。
  • 嗯,我确实尝试重新启动服务器,但这似乎不是问题所在。不过,我不确定您明确指定默认值是什么意思...
【解决方案2】:

Ruby on Rails 具有用于格式化 DateTime 实例的内置预设。这是我机器上Time 的含义:

>> Time::DATE_FORMATS
=> {:short=>"%d %b %H:%M", :db=>"%Y-%m-%d %H:%M:%S", :rfc822=>#<Proc:0x0000000103700b08@/Users/donovan/.gem/gems/activesupport-3.0.1/lib/active_support/core_ext/time/conversions.rb:13>, :time=>"%H:%M", :number=>"%Y%m%d%H%M%S", :long_ordinal=>#<Proc:0x0000000103700e50@/Users/donovan/.gem/gems/activesupport-3.0.1/lib/active_support/core_ext/time/conversions.rb:12>, :long=>"%B %d, %Y %H:%M"}

您可以像这样轻松使用它们:

>> Time.now.to_s(:db)
=> "2011-01-12 15:26:11"

您也可以定义并使用它:

>> Time::DATE_FORMATS[:mine] = "%H:%M"
=> "%H:%M"
>> Time.now.to_s(:mine)
=> "15:28"

【讨论】:

  • 我应该把“Time::DATE_FORMATS[:mine] = "%H:%M"" 放在哪里?您使用的是哪个版本的 Ruby/Rails?当我尝试这样做时,我在 irb 中得到“NameError: uninitialized constant Time::DATE_FORMATS”。
  • 我在我测试过的应用程序中使用 Rails 3.0.1。您应该接受@coreyward 的建议,将其添加到语言环境配置中。
【解决方案3】:

您可以在 application_helper.rb 文件中创建自定义函数。可能是这样的:

def custom_time(date)
  date.strftime("%H:%M")
end

不确定这是否是最佳做法,但应该会很好用。

【讨论】:

    【解决方案4】:

    我使用了一个初始化器:config/initializers/time_formats.rb,其中包含:

    [Time, Date].map do |klass|
      klass::DATE_FORMATS[:app_date] = "%m/%d/%Y"
      klass::DATE_FORMATS[:app_month_and_year] = "%B %Y"
      klass::DATE_FORMATS[:app_abbrev_month_and_year] = "%b %Y"
      ...
    end
    

    然后我根据我想要的显示方式使用 Time.now.to_s(:app_date) 等。 您可以添加 Time::DATE_FORMATS[:default] = "%H:%M" 来完成您想要做的事情。虽然这不是国际化的 - 为此,coreyward 的答案可能更好。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-01
      • 1970-01-01
      • 2013-10-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多