Ruby文档中主要有三个与日期和时间相关的类,它们分别如下所示 -
- Date
- DateTime
- Time
日期(Date)
Ruby日期处理主要提供了两个类:Date
和DateTime
。要了解日期的概念,首先我们需要了解下面一些术语。
日历日期:日历日期是一年内的一个日历月内的特定日期。
有序日期:序数日期是由其序号确定的日历年的特定日期。
周日期:周日期是按日历周和日数确定的日期。一年的第一个日历周是包括那一年的第一个星期四。
儒略日数:儒略日数是从中午经过公元前4713 1月1日的天数。
修改后的朱莲日数:修改后的朱利安日数是自1858年11月17日午夜过后的一天。
Date对象使用::new
, ::parse
, ::today
, ::jd
和 ::strptime
等创建。所有日期对象都是不可变的,因此它们不能自己修改。
示例:
#!/usr/bin/ruby
# file : datetime-example.rb
require 'date'
puts Date.new(2017,9,3)
puts Date.jd(2451877)
puts Date.ordinal(2017,9)
puts Date.commercial(2017,5,6)
puts Date.parse('2017-08-03')
puts Date.strptime('03-02-2017', '%d-%m-%Y')
puts Time.new(2017,11,8).to_date
执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby datetime-example.rb
2017-09-03
2000-11-28
2017-01-09
2017-02-04
2017-08-03
2017-02-03
2017-11-08
F:\worksp\ruby>
Date
类对象具有以下示例所示的各种方法。
示例:
#!/usr/bin/ruby
# file : datetime-method.rb
require 'date'
d = Date.parse('4th Mar 2019')
puts d.year
puts d.mon
puts d.mday
puts d.wday
puts d += 1
puts d.strftime('%a %d %b %Y')
执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby datetime-method.rb
2019
3
4
1
2019-03-05
Tue 05 Mar 2019
F:\worksp\ruby>
日期时间(DateTime)
Ruby DateTime
是Date
的子类。 它可以轻松处理日期,时间,分钟,秒和偏移量。
DateTime
对象使用DateTime.new
,DateTime.ordinal
,DateTime.parse
,DateTime.jd
,DateTime.commercial
,DateTime.now
等来创建。
示例:
#!/usr/bin/ruby
# file : datetime-new.rb
require 'date'
puts DateTime.new(2019,3,4,5,6,7)
执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby datetime-new.rb
2019-03-04T05:06:07+00:00
F:\worksp\ruby>
日,分,秒或小时的最后一个元素可以是小数。DateTime
对象具有多种方法,如下例所示。
示例:
#!/usr/bin/ruby
# file : datetime-allmethod.rb
require 'date'
d = DateTime.parse('4th Mar 2019 02:37:05+05:40')
puts d.hour
puts d.min
puts d.sec
puts d.offset
puts d.zone
puts d += Rational('1.0')
puts d = d.new_offset('+05:00')
puts d.strftime('%I:%M:%S %p')
puts d > DateTime.new(2000)
执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby datetime-allmethod.rb
2
37
5
17/72
+05:40
2019-03-05T02:37:05+05:40
2019-03-05T01:57:05+05:00
01:57:05 AM
true
F:\worksp\ruby>
时间(Time)
Time类是日期和时间的抽象。 它内部存储为自大纪元时间以来的秒数。Time类对待格林尼治标准时间(格林尼治标准时间)和UTC(协调世界时))等效。
时间可能看起来相等,但是比较起来可能会有所不同,因为所有的时间都可能有分数。
时间实现使用带符号的63
位整数Bignum
或Rational
。使用整数时,时间处理较慢。
创建新的时间实例
可以使用::new
创建新的Time
实例。这可使用获取当前系统的时间。 部分时间,如年,月,日,小时,分钟等也可以通过这种方法获得。
创建新的时间实例时,您需要指定传递至少年份。 如果只有通过了指定年份,那么时间将默认为当前系统时区的那个年份的1月1日 00:00:00
开始。
示例:
#!/usr/bin/ruby
# file : datetime-allmethod.rb
require 'date'
puts Time.new
puts Time.new(2018, 3)
puts Time.new(2018, 3, 4)
puts Time.new(2019, 3, 4, 6, 5, 5, "+05:00")
执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby date-example.rb
2017-05-08 23:31:03 +0800
2018-03-01 00:00:00 +0800
2018-03-04 00:00:00 +0800
2019-03-04 06:05:05 +0500
F:\worksp\ruby>
Time对象和 gm, utc 以及 local 方法
如果不使用当前的系统设置,也可以使用gm
, utc
以及 local
这些方法。
示例:
puts Time.local(2018, 2, 5)
puts Time.local(2019, 2, 5, 4, 30)
puts Time.utc(2018, 2, 5, 4, 30)
puts Time.gm(2018, 2, 5, 4, 30, 36)
执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby time-methods.rb
2018-02-05 00:00:00 +0800
2019-02-05 04:30:00 +0800
2018-02-05 04:30:00 UTC
2018-02-05 04:30:36 UTC
F:\worksp\ruby>
使用时间的实例
创建时间实例后,我们可以按照以下方式工作。
示例:
#!/usr/bin/ruby
# file : time-instance.rb
t = Time.new(1991, 07, 5, 9, 15, 33, "+09:00")
puts t.friday? #=> false
puts t.year #=> 1993
puts t.dst? #=> false
puts t + (60*60*24*365) #=> 1994-02-24 12:00:00 +0900
puts t.to_i #=> 730522800
t1 = Time.new(2019)
t2 = Time.new(2017)
puts t1 == t2 #=> false
puts t1 == t1 #=> true
puts t1 < t2 #=> true
puts t1 > t2 #=> false
puts Time.new(2010,10,31).between?(t1, t2) #=> true
执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby time-instance.rb
true
1991
false
1992-07-04 09:15:33 +0900
678672933
false
true
false
true
false
F:\worksp\ruby>
时区和夏令时间
Time
对象可用于获取与时区相关的所有信息。将显示系统的当前时间的所有信息。
示例:
#!/usr/bin/ruby
# file : time-instance.rb
time = Time.new
puts time.zone
puts time.utc_offset
puts time.zone
puts time.isdst
puts time.utc?
puts time.localtime
puts time.gmtime
puts time.getlocal
puts time.getutc
执行上面代码,得到以下结果 -
F:\worksp\ruby>ruby timezones-daylight.rb
中国标准时间
28800
中国标准时间
false
false
2018-05-08 23:43:42 +0800
2018-05-08 15:43:42 UTC
2018-05-08 23:43:42 +0800
2018-05-08 15:43:42 UTC
F:\worksp\ruby>