updated: 04 April 2013

关于时间的操作也是编程过程中常常要使用到的,比如获取时间、比较时间、记录时间等,学会关于时间的操作也不是很复杂。

获取当前时间

使用 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