本文简要介绍ruby语言中 DateTime类
的用法。
DateTime
Date
的子类,可以轻松处理日期、小时、分钟、秒和偏移量。
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 Shakespeare 和 Miguel 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 DateTime jisx0301()用法及代码示例
- Ruby DateTime.hour用法及代码示例
- Ruby DateTime.jd用法及代码示例
- Ruby DateTime.zone用法及代码示例
- Ruby DateTime ordinal()用法及代码示例
- Ruby DateTime.second用法及代码示例
- Ruby DateTime to_datetime()用法及代码示例
- Ruby DateTime civil()用法及代码示例
- Ruby DateTime.second_fraction用法及代码示例
- Ruby DateTime second_fraction()用法及代码示例
- Ruby DateTime httpdate()用法及代码示例
- Ruby DateTime zone()用法及代码示例
- Ruby DateTime iso8601()用法及代码示例
- Ruby DateTime to_s()用法及代码示例
- Ruby DateTime.sec用法及代码示例
- Ruby DateTime sec_fraction()用法及代码示例
- Ruby DateTime rfc2822()用法及代码示例
- Ruby DateTime offset()用法及代码示例
- Ruby DateTime xmlschema()用法及代码示例
- Ruby DateTime.xmlschema用法及代码示例
- Ruby DateTime.iso8601用法及代码示例
- Ruby DateTime.now用法及代码示例
- Ruby DateTime.ordinal用法及代码示例
- Ruby DateTime.rfc3339用法及代码示例
- Ruby DateTime minute()用法及代码示例
注:本文由纯净天空筛选整理自ruby-lang.org大神的英文原创作品 DateTime类。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。