前言
本文為《現代 PHP》一書的學習筆記。
環境
- Windows 10
- Wnmp 3.1.0
日期、時間和時區
處理日期和時間相關的問題是件棘手的事情,需要考量到日期格式、時區、日光節約時間、閏年和不同天數的月份。幸好,使用 PHP 5.2.0 中實作的 DateTime
、DateInterval
和 DateTimeZone
類別,可以準確地建立和調整日期、時間和時區。
設定初始時區
如果沒有宣告初始時區,PHP 會顯示 E_WARNING
訊息。有兩種方式可以設定時區:
- 在
php.ini
檔中設定。
1 | date.timezone = 'America/New_York'; |
- 在執行時期使用
date_default_timezone_set()
宣告初始時區。
範例 5-9:設定初始時區
1 | date_default_timezone_set('America/New_York'); |
- 完整的 PHP 時區辨識碼列表,可以在 PHP Manual 找到。
DateTime 類別
DateTime
類別提供了物件導向介面來管理日期和時間。
範例 5-10:DateTime
類別
1 | $datetime = new DateTime(); |
不使用參數的情況下,DateTime
類別建立了一個代表當前日期和時間的實體,可以傳入特定的字串參數到 DateTime
類別建構式,指定需要的日期和時間。
範例 5-11:帶有參數的 DateTime
類別
1 | $datetime = new DateTime('2014-04-27 5:03 AM'); |
使用 DateTimeFromFormat()
靜態方法可以使用自訂格式的時間和日期建立 DateTime
實體。
範例 5-12:帶有靜態建構式的 DateTime
類別。
1 | $datetime = DateTime::createFromFormat('M j, Y H:i:s', 'Jan 2, 2014 23:04:12'); |
DateInterval 類別
DateInterval
實體代表固定長度的時間(例如「兩天」)或相對長度的時間(例如「昨天」),DateInterval
實體可以修改 DateTime
實體。
區間規範是一個以 P
為開頭的字串,並接上一個整數,最後接上一個週期代號(period designator)修飾前一個整數,並以字母 T
分隔日期和時間部分,有效的週期代號為:
Y
(年)M
(月)D
(日)W
(週)H
(時)M
(分)S
(秒)
例如週期代號 P2D
代表兩天、P2DT5H2M
代表兩天五時又兩分。
以下例子利用 add()
方法修改 DateTime
實體。
範例 5-13:DateInterval
類別
1 | date_default_timezone_set('America/New_York'); |
也可以建立一個相反的 DateInterval
實體,用相反的順序走訪 DatePeriod
實體。
範例 5-14:相反的 DateInterval
類別
1 | date_default_timezone_set('America/New_York'); |
DateTimeZone 類別
傳入一個有效的時區辨識碼到 DateTimeZone
類別建構式。
1 | $timezone = new DateTimeZone('America/New_York'); |
DateTime
實體建構式的第二個參數就是 DateTimeZone
,如果忽略第二個參數,時區會被設定為初始時區。
1 | $timezone = new DateTimeZone('America/New_York'); |
也可以使用 setTimezone()
方法來改變 DateTime
實體的時區。
範例 5-15:DateTimeZone
類別
1 | date_default_timezone_set('America/New_York'); |
DatePeriod 類別
有時候需要以固定的時間區間疊代一串日期時間,像是月曆中的重複事件。
DatePeriod
類別建構式需要三個參數:
- 第一個是
DateTime
實體,代表疊代的起始日期時間。 - 第二個是
DateInterval
實體,代表疊代日期時間的區間。 - 第三個是一個整數,代表疊代的總數。
範例 5-16:DatePeriod
類別
1 | date_default_timezone_set('America/New_York'); |
如果想要排除疊代的初始日期,可以傳入 DatePeriod::EXCLUDE_START_DATE
常數作為最後的建構式參數。
範例 5-17:帶有自選參數的 DatePeriod
類別
1 | date_default_timezone_set('America/New_York'); |
相關元件
Brian Besbitt 的 nesbot/carbon 元件提供簡單的使用者介面和許多好用的方法用來處理日期與時間。
參考資料
- Josh Lockhart(2015)。現代 PHP。台北市:碁峯資訊。