Ruby on rails 使用rails将日期字符串转换并保存到数据库时使用的格式

Ruby on rails 使用rails将日期字符串转换并保存到数据库时使用的格式,ruby-on-rails,date,Ruby On Rails,Date,我的用户希望使用日期格式%d/%m/%Y(例如:26/02/2011) 为了正确显示日期,我因此在environment.rb中更改为:默认格式: environment.rb : ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!( :default => "%d/%m/%Y" ) 它工作正常,但我在试图将以这种格式输入的日期字符串保存到数据库中时遇到了一个问题 Rails似乎将字符串的

我的用户希望使用日期格式%d/%m/%Y(例如:26/02/2011)

为了正确显示日期,我因此在environment.rb中更改为:默认格式:

environment.rb :

ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS.merge!(
     :default => "%d/%m/%Y"
)
它工作正常,但我在试图将以这种格式输入的日期字符串保存到数据库中时遇到了一个问题

Rails似乎将字符串的格式设置为%m/%d/%Y,而不是%d/%m/%Y
2011年2月4日保存为2011-04-02,2011年2月26日无效且未保存

我为此寻找解决方案,但我发现的解决方案依赖于在我的模型中重新设置日期,如下面的一个:

mymodel.rb :   

def datefield_formatted
   datefield.strftime '%m/%d/%Y'
end

def datefield_formatted=(value)
   self.datefield = Time.parse(value)
end


view.html.erb :

<%= form.input :datefield_formatted %>
mymodel.rb:
def datefield_格式化
datefield.strftime“%m/%d/%Y”
结束
def datefield_formatted=(值)
self.datefield=Time.parse(值)
结束
view.html.erb:
我可以使用这个解决方案,但它需要为每个“日期字段”(我的应用程序中有很多)更改我的模型


因此,我想知道在转换并保存到数据库时,是否有一个was命令Rails将字符串正确地“读取”为%d/%m/%Y

我认为最好是以常用的sql格式保存日期(即日期字段不是varchar),只在%d/%m/%Y中显示日期。 为此,我通常使用本地化文件和l(日期)函数。 例如 此文件位于本地化文件中

date: formats: default: "%d/%m/%Y" 日期: 格式: 默认值:“%d/%m/%Y” 无论在视图中何时使用日期,都会显示此信息
l(日期)


另一个想法是重载activerecord如何保存日期,但这有点过头了:/

我最终找到了一个更深入地搜索Stackoverlow的解决方案:

这篇博文解释了问题并给出了有效的解决方案:

我们有:lib/column-patch.rb

我们添加了config/environment.rb


日期保存为SQL中的日期字段。-这就是我遇到问题的原因:我的表单发送的字符串保存为日期,但Rails没有使用正确的格式解析日期。是的,因为您更改了日期格式,如果您通过本地化进行更改,那么就可以了。删除日期格式并使用本地化并没有做到这一点。-当我的表单发送日期字符串06/02/2011时,它将保存为2011-06-02,而不是2011-02-06:-(是的,表单有点棘手:)我遇到了这个问题,我所做的只是用正则表达式修复了字符串:/我使用了日历插件,所以这是唯一的选择。我的问题是jquey UI日历。我发布的答案为我解决了这个问题。
class ActiveRecord::ConnectionAdapters::Column

def self.string_to_date(string)
    return string unless string.is_a?(String)

    begin
        return DateTime.strptime(string, ActiveSupport::CoreExtensions::Date::Conversions::DATE_FORMATS[:default])
    rescue
        date_array = ParseDate.parsedate(string)
        # treat 0000-00-00 as nil
        Date.new(date_array[0], date_array[1], date_array[2]) rescue nil
    end
end

def self.string_to_time(string)
    return string unless string.is_a?(String)

    begin
    if dt=Date._strptime(string,ActiveSupport::CoreExtensions::Time::Conversions::DATE_FORMATS[:default])
        return Time.mktime(*dt.values_at(:year, :mon, :mday, :hour, :min, :sec, :zone, :wday))
    else
        raise "Bad format"
    end
    rescue
        time_hash = Date._parse(string)
        time_hash[:sec_fraction] = microseconds(time_hash)
        time_array = time_hash.values_at(:year, :mon, :mday, :hour, :min, :sec, :sec_fraction)
        # treat 0000-00-00 00:00:00 as nil
        Time.send(ActiveRecord::Base.default_timezone, *time_array) rescue DateTime.new(*time_array[0..5]) rescue nil
    end
end

end
require 'column-patch'