Time to_s(:db) 的背后

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"
>>

你可能感兴趣的:(ext,项目管理,Blog,Rails,rubygems)