当前位置: 首页>>代码示例 >>用法及示例精选 >>正文


Ruby DateTime类用法及代码示例


本文简要介绍ruby语言中 DateTime类 的用法。

DateTime

Date 的子类,可以轻松处理日期、小时、分钟、秒和偏移量。

DateTime 类被视为已弃用。使用 Time 类。

DateTime 不考虑任何闰秒,不跟踪任何夏令时规则。

DateTime 对象是用 DateTime::new , DateTime::jd , DateTime::ordinal , DateTime::commercial , DateTime::parse , DateTime::strptime , DateTime::now , Time#to_datetime 等创建的。

require 'date'

DateTime.new(2001,2,3,4,5,6)
                    #=> #<DateTime: 2001-02-03T04:05:06+00:00 ...>

日、小时、分钟或秒的最后一个元素可以是小数。假设小数的精度最多为纳秒。

DateTime.new(2001,2,3.5)
                    #=> #<DateTime: 2001-02-03T12:00:00+00:00 ...>

可选参数 offset 表示本地时间和 UTC 之间的差异。例如,Rational(3,24) 表示提前 3 小时 UTC,Rational(-5,24) 表示落后 5 小时 UTC。偏移量应为 -1 到 +1,并且假定其精度最多为秒。默认值为零(等于 UTC)。

DateTime.new(2001,2,3,4,5,6,Rational(3,24))
                    #=> #<DateTime: 2001-02-03T04:05:06+03:00 ...>

偏移量也接受字符串形式:

DateTime.new(2001,2,3,4,5,6,'+03:00')
                    #=> #<DateTime: 2001-02-03T04:05:06+03:00 ...>

可选参数,日历改革日 (start),表示儒略日数,应为 2298874 到 2426355 或负/正无穷大。默认值为Date::ITALY (2299161=1582-10-15)。

DateTime 对象有多种方法。请参阅每个参考。

d = DateTime.parse('3rd Feb 2001 04:05:06+03:30')
                    #=> #<DateTime: 2001-02-03T04:05:06+03:30 ...>
d.hour              #=> 4
d.min               #=> 5
d.sec               #=> 6
d.offset            #=> (7/48)
d.zone              #=> "+03:30"
d += Rational('1.5')
                    #=> #<DateTime: 2001-02-04%16:05:06+03:30 ...>
d = d.new_offset('+09:00')
                    #=> #<DateTime: 2001-02-04%21:35:06+09:00 ...>
d.strftime('%I:%M:%S %p')
                    #=> "09:35:06 PM"
d > DateTime.new(1999)
                    #=> true

什么时候应该使用 DateTime ,什么时候应该使用 Time

历史上 William ShakespeareMiguel de Cervantes 死于同一天是一个普遍的误解,以至于联合国教科文组织将 4 月 23 日命名为 World Book Day because of this fact。但是,由于英格兰尚未采用 Gregorian Calendar Reform(直到 1752 才采用),他们的死亡实际上相隔 10 天。由于 Ruby 的 Time 类实现了 proleptic Gregorian calendar 并且没有日历改革的概念,因此无法用 Time 对象来表达这一点。这是 DateTime 介入的地方:

shakespeare = DateTime.iso8601('1616-04-23', Date::ENGLAND)
 #=> Tue, 23 Apr 1616 00:00:00 +0000
cervantes = DateTime.iso8601('1616-04-23', Date::ITALY)
 #=> Sat, 23 Apr 1616 00:00:00 +0000

您已经可以看到一些奇怪的事情 - 一周中的日子不同。更进一步:

cervantes == shakespeare
 #=> false
(shakespeare - cervantes).to_i
 #=> 10

这表明他们实际上相隔 10 天去世(实际上距离塞万提斯前一天去世但在 23 日被埋葬的时间已经过去了 11 天)。我们可以通过使用 gregorian 方法转换它来看到莎士比亚的实际去世日期:

shakespeare.gregorian
 #=> Tue, 03 May 1616 00:00:00 +0000

因此有一种说法认为,所有在 4 月 23 日 Stratford-upon-Avon 举行的庆祝活动实际上都是错误的日期,因为英格兰现在使用的是公历。当我们跨越改革日期边界时,您可以看到为什么:

# start off with the anniversary of Shakespeare's birth in 1751
shakespeare = DateTime.iso8601('1751-04-23', Date::ENGLAND)
 #=> Tue, 23 Apr 1751 00:00:00 +0000

# add 366 days since 1752 is a leap year and April 23 is after February 29
shakespeare + 366
 #=> Thu, 23 Apr 1752 00:00:00 +0000

# add another 365 days to take us to the anniversary in 1753
shakespeare + 366 + 365
 #=> Fri, 04 May 1753 00:00:00 +0000

如您所见,如果我们准确跟踪自莎士比亚生日以来的solar years 的数量,那么正确的周年纪念日应该是 5 月 4 日,而不是 4 月 23 日。

那么什么时候应该在Ruby中使用 DateTime ,什么时候应该使用 Time ?几乎可以肯定,您会想要使用 Time ,因为您的应用程序可能正在处理当前日期和时间。但是,如果您需要在历史背景下处理日期和时间,您将需要使用 DateTime 以避免犯与 UNESCO 相同的错误。如果您还必须处理时区,那么祝您好运 - 请记住,您可能会处理 local solar times ,因为直到 19 世纪铁路的引入才需要 Standard Time 以及最终的时区。

相关用法


注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 DateTime类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。