ruby time
关于时间的操作也是编程过程中常常要使用到的,比如获取时间、比较时间、记录时间等,学会关于时间的操作也不是很复杂。
获取当前时间
使用 Time 类提供的一系列方法可以得到与时间相关的各种操作,最基本的一个就是获取当前的时间了:
>> Time.now # => 2013-04-04 15:34:27 +0800
>> Time::now # => 2013-04-04 15:34:30 +0800
这两个方法是一样的,一般习惯于用上面的 Time.now() 方法来得到时间,反正是的年月日时间和时区这样的一个格式。所以 now() 方法获得的是我当前的时间,同时也是北京时间,+08:00 这样的时间内。
那要获得世界统一时间怎么办呢?首先得了解两个概念,GMT (Greenwich Mean Time) 和 UTC (Coordinated Universal Time),这两个是一样的概念,ruby 中把它们同本地时间做了区分。可以通过下面的方法来获得世界统一时间:
>> Time.now.getutc # => 2013-04-04 07:49:28 UTC
>> Time.now.getgm # => 2013-04-04 07:49:31 UTC
这里把当前的时间对象存放到一个时间对象中,而使用几个觉的方法:
>> t = Time.now # => 2013-04-04 16:07:45 +0800
>> t.zone # => "中国标准时间"
>> t.year # => 2013
>> t.month # => 4
>> t.day # => 4
>> t.hour # => 16
>> t.min # => 7
>> t.sec # => 45
创建时间对象
可以通过使用 local() 函数来创建一个时间对象,同样在 ruby 里面是区分本地时区的时间和世界统一时区的时间的,比如创建本时时间用的是:
local(year, month, day, hour, min, sec, usec_with_frac) → time
mktime(year, month, day, hour, min, sec, usec_with_frac) → time
而世界时间用的是:
utc(year, month, day, hour, min, sec, usec_with_frac) → time
gm(year, month, day, hour, min, sec, usec_with_frac) → time
上面的两个方法中,很好理解,除了至少是需要一个 year 参数外,其它的都可以省略:
>> Time.local(2012) # => 2012-01-01 00:00:00 +0800
>> Time.local(2012, 2, 14) # => 2012-02-14 00:00:00 +0800
>> Time.local(2012, 2, 14, 12, 23, 59) # => 2012-02-14 12:23:59 +0800
>> Time.utc(2013) # => 2013-01-01 00:00:00 UTC
时间的转换
存在时间对象中的值,是一个从 1970 年 1 月 1 号 0 点 0 分到现在的时间的秒记的,怎么样,很奇怪吧。我们首先来看一下把时间对象转换成浮点数和字符串:
>> t = Time.now # => 2013-04-04 16:07:45 +0800
>> t.to_f # => 1365062865.369408 1970 年到今天的秒数
>> t.to_s # "2013-04-04 16:07:45 +0800"
这里再来创建一个 1970 年的时间来解理一下:
>> history = Time.utc(1970) # => 1970-01-01 00:00:00 UTC
>> history.to_f # => 0.0
>> history = Time.utc(1971) # => 1971-01-01 00:00:00 UTC
>> history.to_f # => 31536000.0 一年有这么多秒
原来是秒数,那肯定就可以非常方便的去比较和计算了。
时间的计算和比较
可以在时间上做加,减运算来计算时间,当然也可以做乘除运算,但是没有什么意义。做加减运算当然是以秒来进行的,现在,让我们加上一点时间来看看效果:
>> t = Time.now # => 2013-04-04 16:26:07 +0800
>> t + 10 # => 2013-04-04 16:26:17 +0800 加了 10 秒
>> t + (60 * 10) # => 2013-04-04 16:36:07 +0800 加了 10 分
>> t + (60 * 60 * 24) # => 2013-04-05 16:26:07 +0800 加了 1 天
再来看看距离明年还有多长的时间,这个操作须要新建一个时间对象,让他们做减法运算:
>> future = Time.local(2014) # => 2014-01-01 00:00:00 +0800
>> future - t # => 23441632.515555 得到的值是秒数
>> (future - t) / (60 * 60 * 24) # => 271.31519115225694 转换成了天数
通过将得到的秒数进行计算而得到天数。时间的比较也是很容易的,也就是浮点数之间的比较而以:
>> t < future # => true
其它的逻辑运算也是支持的。
友好的显示时间
通过 Time 类带的 strftime() 这个方法,可以将时间转换成人类容易读懂的方式,它的形式多种多样,我们看几个常用的方式。
>> t = Time.now # => 2013-04-04 16:26:07 +0800
>> t.strftime("%Y%m%d") # => "20130404"
>> t.strftime("post at %F") # => "post at 2013-04-04"
>> t.strftime("at %I:%M%p") # => "at 04:26PM"
更多的用法当然可以去查 API 文档。
其它的 API
>> t.monday? # => false 星期一么?
>> t.thursday? # => true 星期四么?
>> t.wday # => 4 一周里的第几天?
>> t.yday # => 94 一年里的第几天?
参考资料
blog comments powered by Disqus