【发布时间】:2012-04-16 14:36:52
【问题描述】:
我们有一个应用程序,用户可以在其中设置他/她喜欢的日期/时间格式。用户应在整个应用程序中以配置的格式输入datetime。现在的问题是对于少数格式,datetime 被错误解析,而 create/update ActiveRecord。
例如,用户在hh:mm dd/MM/yyyy 中设置了日期/时间格式。现在,如果用户输入17:00 04/05/2012,它会将其解析为5 PM 5 Apr, 2012,它应该是5 PM 4 May, 2012
1.8.7 :004 > a = Article.create!(:name => 'a1', :published_at => '17:00 04/05/2012')
=> #<Article id: 2, name: "a1", published_at: "2012-04-05 17:00:00", created_at: "2012-04-16 13:54:36", updated_at: "2012-04-16 13:54:36">
我知道 ruby/rails 已经预定义了一组格式,用于评估日期/时间字符串,如果按顺序匹配任何格式,它会解析具有该格式的给定字符串。
另一个例子
1.8.7 :006 > a = Article.create!(:name => 'a1', :published_at => '17:00 15/12/2012')
=> #<Article id: 4, name: "a1", published_at: nil, created_at: "2012-04-16 13:55:43", updated_at: "2012-04-16 13:55:43">
这里用户输入15 December, 2012,被解析为nil
有人已经在here 和ruby-forum 上提出过类似的问题,但该解决方案不适用于我的情况,因为我无法在应用程序中配置单一的日期时间格式,因为每个用户都有自己喜欢的日期时间格式。
现在要使用多个datetime 格式,我计划在将params 传递给ActiveRecord 之前对其进行操作。所以步骤会喜欢
- 从
params地图读取datetime - 使用用户首选的日期时间格式对其进行解析
- 将
datetime格式化为ActiveRecord使用的默认格式 - 将
params中的当前datetime替换为重新格式化的日期时间
这是一个控制器的sn-p
class ArticlesController < ApplicationController
before_filter :format_date_time, :only => [:create, :update]
...
...
private
def format_date_time
datetime = params[:datetime]
params[:datetime] = DateTime.strptime(datetime, pref_date_time_format).strftime('%c')
end
end
有没有人可以验证它是否是正确的方法?如果有人提出更好的方法来实现这一点,我将不胜感激。
谢谢, 阿米特·帕特尔
【问题讨论】:
-
Here 很好地解释了
string如何在ActiveRecord中自动转换为date -
Draiken 已在ruby-forum 上回复此问题
标签: ruby ruby-on-rails-3 datetime activerecord