将标准 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】:我必须使用 altField
和 altFormat
选项才能使其按所述工作:
$('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 时间转换为美国格式 - 日期混淆的主要内容,如果未能解决你的问题,请参考以下文章