将标准 rails / ruby​​ 时间转换为美国格式 - 日期混淆

Posted

技术标签:

【中文标题】将标准 rails / ruby​​ 时间转换为美国格式 - 日期混淆【英文标题】:Convert standard rails / ruby time to American format - dates getting mixed up 【发布时间】:2012-12-10 08:36:26 【问题描述】:

我正在尝试将表单中的 YYYY-MM-DD 格式转换为 MM/DD/YYYY - 这是一种非常标准的美国日期格式。不知道该怎么做——我认为在 /show 中的日期实例上调用 .strftime("%m/%d/%Y") 可以解决问题。非常困惑 - 找不到解释如何转换实际有意义的日期的文档。我正在关注这个 railscast:http://railscasts.com/episodes/213-calendars-revised

如果有帮助,我正在使用 jQuery datepicker 并拥有这个咖啡脚本:

jQuery ->
  $('input.datepicker').datepicker()
    dateFormat: 'mm-dd-yy'
    weekStart: 0
    autoclose: true

_form

   <%= f.label :due %><br />
   <%= f.text_field :due,  :class => 'datepicker'  %>

上面将MM/DD/YYYY格式的日期输入到表格中,但是保存为YYYY-MM-DD

--- 找到更新/解决方案---

事实证明我走在了正确的轨道上,实际上并没有发疯。我的部分问题是我遇到了一个 nil 对象问题,通过在我的视图中调用 .try 来解决这个问题,如果不是 nil,它只会运行该方法。

.try(:strftime, "%m/%d/%Y") 

另外 - 我安装了以下 gem:gem 'american_date',它会自动解析日期。在显示视图中效果很好,但在表单视图中仍然会出现 YYYY-MM-DD(仅限编辑视图)。

【问题讨论】:

如果显示正确,你为什么关心它是如何保存的? 我不想让我的用户感到困惑,因为他们希望使用标准的美式日期格式。 我知道。关键是,只要它以美国格式显示,谁在乎它是如何存储的? 没错,我不在乎它是如何存储的。我刚刚意识到我遇到了一个 nil 对象问题,该问题已通过 .try(:strftime, "%m/%d/%Y") 得到解决 如果您解决了您的问题,请将下面的答案添加为答案并接受它 【参考方案1】:

在 RoR 中处理日期时,我们必须解决三个任务。我发现这些解决方案对我来说是最简单的:

1.如何正确显示日期。

安装 I18n gem 并检查 config\locales\en.yml 中的日期格式。然后使用 I18n.l()(或仅 l)表单助手来本地化 html.erb 文件中的日期。

  date:
    formats:
      default: "%m/%d/%y"

2.如何方便用户修改日期。

使用 jQuery datepicker(或 bootstrap datepicker 等),并在 jQuery 小部件选项中按照 en.yml 格式设置日期格式。

3.如何将日期从本地化(视图)格式转换为活动记录属性。

安装 Delocalize gem 并将 :input 子部分添加到 en.yml 文件的 date: 部分。

input:
  formats:
    - :default

现在您的日期将在您分配时自动从本地化格式 (mm/dd/yy) 转换为数据库格式 (yyyy-mm-dd)。

【讨论】:

【参考方案2】:

我必须使用 altFieldaltFormat 选项才能使其按所述工作:

$('input.datepicker').datepicker(
   dateFormat: "mm/dd/yy", 
   altField: alt_field, 
   altFormat: "yy-mm-dd");

这需要有一个隐藏字段alt_field,它实际上以标准数据库格式保存您的日期。

【讨论】:

PinnyM,这看起来像是一个潜在的解决方案。我对做一个隐藏的“alt_field”知之甚少——有什么推荐的读物吗?我需要将其添加到我的模型还是只是表单? 您将其添加到您的表单中 - 参见 the docs 示例。 我在表单中添加了以下内容(在 f.label 和 f.text_field 之后)。 Datepicker 和 show 有效,但仍无法正确保存日期。 -------- 'alternative' %> text_field 需要有一个不同的名称 - 一个不与隐藏字段冲突的名称。您需要根据模型对象初始化 text_field 值(格式化为显示),并使用隐藏字段来更新模型对象。并将 alt_field 替换为隐藏字段的选择器 - '#model_name_due'。如果它仍然不起作用 - 请发布您正在使用的完整 html。 感谢所有建议,PinnyM。我最终找到了一个让美国约会变得简单的宝石:gem 'american_date'【参考方案3】:

包含以下 gem,它会自动将美国日期保存为 db 格式。

gem 'american_date'

【讨论】:

以上是关于将标准 rails / ruby​​ 时间转换为美国格式 - 日期混淆的主要内容,如果未能解决你的问题,请参考以下文章

Ruby on rails Haversine gem:将计算距离转换为公里

Ruby on Rails,将项目范围的单引号转换为双引号

将 Nokogiri 文档转换为 Ruby 哈希

将数据库模型转换为 Ruby On Rails 上的模型

将 Ruby on Rails 应用程序转换为 Phonegap iOS 应用程序的步骤是啥?

Ruby 将对象转换为哈希