rails提供了很友好的管理时间的API,其中包括 创建,计算,格式化。
其中,对时间格式化支持的主要代码下面这个文件中
active_support/core_ext/time/conversions.rb
def self.included(klass) #:nodoc:
klass.send(:alias_method, :to_default_s, :to_s)
klass.send(:alias_method, :to_s, :to_formatted_s)
end
def to_formatted_s(format = :default)
DATE_FORMATS[format] ? strftime(DATE_FORMATS[format]).strip : to_default_s
end
用included对被加载代码,进行hack,在rails中到处都是,最经典的是rails acts_as模块,
这个会在以后的blog中重点讲到。
在这里,conversions.rb将to_s的调用转移到方法to_formatted_s。
下面就很清楚了,直接从常量DATE_FORMATS中拿出format,然后交给strftime。
看看,短短两行代码,就可以将时间格式化的api转换成:
Time.now.to_s(:db) #"2007-11-19 12:10:14"
rails内置了4个
DATE_FORMATS = {
:db => "%Y-%m-%d %H:%M:%S",
:short => "%d %b %H:%M",
:long => "%B %d, %Y %H:%M",
:rfc822 => "%a, %d %b %Y %H:%M:%S %z"
}
当然,如果你要扩展,也很容易
Time::DATE_FORMATS[:stamp] = '%Y%m%d%M%S'
这个代码在rails加载完毕后加入,或者直接放到lib中的某个文件中。
使用的时候
>> Time.now.to_s(:stamp)
=> "200711191316"
>>