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 常量。
杜驍 ·
2025 imooc.com All Rights Reserved |