Ruby 的时间类
在本章中,您将学习到 Ruby 操纵时间的类,如何将字符串转换为时间对象如何将字符串转换为时间对象,如何将时间分解成部分(天/小时/毫秒…),格式化时间,时间对象之间的差值。
1. Time 类
您可以在 Ruby 中使用 Time 类来表示时间和日期,日期包括年、月、日,时间包括:时、分、秒。
该信息由 Time 类存储为距大纪元以来的秒数,也称为 Unix时间。
1.1 实例化 Time 时间对象
您可以使用以下三种方式来实例化Time类。
- 使用
now
方法获取此刻的时间对象; - 您可以调用
at
方法使用Unix时间戳创建一个时间对象; - 您可以将开始日期以数字形式提供给
Time.new
(年/月/日)。
实例:
Time.now
# 2020-04-09 23:23:52 +0800
Time.new(2021, 1, 1)
# 2021-01-01 00:00:00 +0800
Time.at(15000000000)
# 2445-05-01 10:40:00 +0800
1.2 获取基本属性
您可以获取时间对象、年月日、时分秒:
实例:
t = Time.now
puts t.day
puts t.month
puts t.hour
# ---- 输出结果 ----
9
4
23
1.3 判断日期的星期
您还可以获取当前是否是星期几:
实例:
t = Time.now
puts t.monday?
puts t.friday?
puts t.thursday?
# ---- 输出结果 ----
false
false
true
1.4 获取时区
使用 zone
方法获取时区:
实例:
t = Time.now
t.zone
# ---- 输出结果 ----
"CST"
如果需要时区偏移,可以使用 utc_offset
方法。此方法的输出以秒为单位,但您可以除以3600,以小时为单位。
实例:
t = Time.now
t.utc_offset / 3600
# ---- 输出结果 ----
8
您还可以使用 utc
获取当前时间:
实例:
t = Time.now
t.utc
# ---- 输出结果 ----
2020-04-09 15:34:49 UTC
1.5 时间格式化
我们使用 strftime
来格式化时间。
实例:
time = Time.new
time.strftime("%d/%m/%Y") # "10/04/2020"
time.strftime("%k:%M") # "0:00"
time.strftime("%I:%M %p") # "12:00 AM"
time.strftime("Today is %A") # "Today is Friday"
time.strftime("%d of %B, %Y") # "10 of April, 2020"
time.strftime("Unix time is %s") # "Unix time is 1586448049"
如您所见,此方法非常灵活。您可以获取不带日期的时间,也可以获取格式正确的日期以及当前月份的年,日和名称。
方法 | 时机简介(调用的时机) |
---|---|
%d | 每月的某天(01…31) |
%m | 一年中的月份(01…12)将%-m 用于(1…12) |
%k | 小时(0…23) |
%M | 分钟 |
%S | 秒(00…60) |
%I | 小时 (1…12) |
%p | AM/PM |
%Y | 年 |
%A | 星期几(名称) |
%B | 月(名称) |
1.6 生成时间戳
使用to_i
获取时间戳(以UTC(世界标准时间)为单位的秒数)。
实例:
Time.now.to_i
# 1586448495
1.7 时差
有时您希望获取将来或过去的时间。您可以对时间对象进行加减法。时间的内部表示以秒为单位,因此您可以执行以下操作:
time = Time.new + 10
您可以通过比较来判断时间先后。
Time.new > time
如果想获取明天的时间
# seconds * minutes * hours
60 * 60 * 24 # 86400
Time.now + 86400
# ---- 输出结果 ----
2020-04-11 00:18:57 +0800
2. Date 类
Date
类没有分钟,秒或小时的概念。此类以天为单位在内部存储所有内容。
注意事项:Date
和DateClass
类位于Rubydate
库中。在使用这些类及其各自的方法之前,必须使用require
指令它。
require 'date'
2.1 实例化 Date 类
我们可以使用 today
类方法来获取当天的时间:
Date.today
# ---- 输出结果 ----
#<Date: 2020-04-10 ((2458950j,0s,0n),+0s,2299161j)>
我们还可以通过new
方法创建一个指定某一天的时间对象。
实例:
require 'date'
date = Date.new(2020, 4, 1)
=> #<Date: 4909645/2,0,2299161>
2.2 获取基本属性
实例化 Date 对象后,我们可以通过 day
、month
、year
实例方法访问它的属性:
实例:
date.day
=> 1
date.month
=> 4
date.year
=> 2020
2.3 解析字符串成为日期
Date.parse
方法将尝试解析任何看起来像日期的字符串:
实例:
Date.parse("10/10/2020")
# ---- 输出结果 ----
#<Date: 2020-10-10 ((2459133j,0s,0n),+0s,2299161j)>
**注意事项:**不准确的字符串会错误解析时间。
可以使用Date.iso8601
方法。使用这个方法的时候,我们需要使用像year-month-day
这种格式的字符串。
实例:
Date.iso8601("2019-10-01")
# ---- 输出结果 ----
#<Date: 2019-10-01 ((2458758j,0s,0n),+0s,2299161j)>
您可以使用Date.strptime
方法和一组格式说明符来提供自己的自定义输入格式。这些是可用于strftime
的说明符。
实例:
Date.strptime("3 of September", "%d of %B") # 2020-09-03
# ---- 输出结果 ----
#<Date: 2020-09-03 ((2459096j,0s,0n),+0s,2299161j)>
另外我们也可以使用Time
来将字符串转换成时间对象。
实例:
require 'time'
Time.parse("September 20 18:00")
# ---- 输出结果 ----
2020-09-20 18:00:00 +0800
我们也可以使用strptime
方法。
实例:
require 'time'
Time.strptime("1 of December 2017", "%d of %B %Y")
# ---- 输出结果 ----
2017-12-01 00:00:00 +0800
Tips:
Date
和Time
创建的实例唯一的区别为对象的类型。
3. DateTime 类
DateTime
类是 Date
的子类,它可以存储除日期以外的秒数。
实例:
require 'date'
DateTime.superclass
# Date
datetime = DateTime.new(2020, 4, 1, 12, 30, 20, '+08:00')
#<DateTime: 2020-04-01T12:30:20+08:00 ((2458941j,16220s,0n),+28800s,2299161j)>
我们可以通过year
、month
、day
、hour
、minute
、second
和zone
来访问它的属性。
datetime.year # 2020
datetime.month # 4
datetime.day # 1
datetime.hour # 12
datetime.minute # 30
datetime.second # 20
datetime.zone # +08:00
我们还可以通过调用类方法now
获取当前的时间。
now = DateTime.now
Tips:
Time
和DateTime
都可以完成相同的工作,主要区别是Time
是用C实现的,因此速度会更快。
Comparison:
Time: 2644596.6 i/s
DateTime: 231634.8 i/s - 11.42x slower
4. Date 常量
> Date::MONTHNAMES # (index 0 = nil)
=> [nil, "January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"]
> Date::DAYNAMES.rotate(1)
=> ["Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday", "Sunday"]
解释:
月份从索引 1 开始,因此您可以获得直接的月份编号->月份名称
映射。
日期从星期日开始,但是您可以使用rotate
方法将星期从星期一开始。
5. 小结
我们在本章中学习了创建日期的 Date
类,创建带有时间日期的 Time
和 DateTime
类 ,并如何实例化它们,还学习了它们的一些常用属性、获取时区、判断星期几、格式化、时间戳。以及使用Date
和 Time
来将字符串转换成时间对象。最后又了解了 2 个常用的 Date 常量。