`
dazuiba
  • 浏览: 130831 次
  • 性别: Icon_minigender_1
  • 来自: 杭州
社区版块
存档分类
最新评论

Time to_s(:db) 的背后

    博客分类:
  • ruby
阅读更多
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"
>>

分享到:
评论
3 楼 lgn21st 2007-11-19  
谢谢楼上,你这个更有用!
2 楼 dazuiba 2007-11-19  

# require 'rubygems' 
# gem 'rails' 
# require 'active_support/core_ext/date/conversions' 
.....
不用这么麻烦的。
active_support存在的意义,就在于你在非rails项目中使用,所以只需要一句
require 'active_support'

就会把所有的扩展都到入
1 楼 lgn21st 2007-11-19  
好文,谢谢,以前一直知道在rails里面这样用,但没有仔细看源码到底是怎么回事,总觉得处理时间转换方面的事情是件麻烦的事情,就懒得自己弄,全部交给rails来处理,没有想到原来这么简单

在非rails的代码里面也前一直用这样的写法

require 'rubygems'
gem 'rails'
require 'active_support/core_ext/time/conversions'

class Date
  include ActiveSupport::CoreExtensions::Time::Conversions
end

Time.now.to_s(:db)


原来就是
Time.now.strftime("%Y-%m-%d %H:%M:%S")

相关推荐

Global site tag (gtag.js) - Google Analytics