?
本文檔使用 php中文網(wǎng)手冊(cè) 發(fā)布
PHP 中 DateTime 類(lèi)的作用是在你讀、寫(xiě)、比較或者計(jì)算日期和時(shí)間時(shí)提供幫助。除了 DateTime 類(lèi)之外,PHP 還有很多與日期和時(shí)間相關(guān)的函數(shù),但 DateTime 類(lèi)為大多數(shù)常規(guī)使用提供了優(yōu)秀的面向?qū)ο蠼涌?。它還可以處理時(shí)區(qū),不過(guò)這并不在這篇簡(jiǎn)短的介紹之內(nèi)。
在使用 DateTime 之前,通過(guò) createFromFormat() 工廠(chǎng)方法將原始的日期與時(shí)間字符串轉(zhuǎn)換為對(duì)象或使用 new DateTime 來(lái)取得當(dāng)前的日期和時(shí)間。使用 format() 將 DateTime 轉(zhuǎn)換回字符串用于輸出。
<?php $raw = '22. 11. 1968'; $start = DateTime::createFromFormat('d. m. Y', $raw); echo 'Start date: ' . $start->format('Y-m-d') . "\n";
對(duì) DateTime 進(jìn)行計(jì)算時(shí)可以使用 DateInterval 類(lèi)。DateTime 類(lèi)具有例如 add() 和 sub() 等將 DateInterval 當(dāng)作參數(shù)的方法。編寫(xiě)代碼時(shí)注意不要認(rèn)為每一天都是由相同的秒數(shù)構(gòu)成的,不論是夏令時(shí)(DST)還是時(shí)區(qū)轉(zhuǎn)換,使用時(shí)間戳計(jì)算都會(huì)遇到問(wèn)題,應(yīng)當(dāng)選擇日期間隔。使用 diff() 方法來(lái)計(jì)算日期之間的間隔,它會(huì)返回新的 DateInterval,非常容易進(jìn)行展示。
<?php // create a copy of $start and add one month and 6 days $end = clone $start; $end->add(new DateInterval('P1M6D')); $diff = $end->diff($start); echo 'Difference: ' . $diff->format('%m month, %d days (total: %a days)') . "\n"; // Difference: 1 month, 6 days (total: 37 days)
DateTime 對(duì)象之間可以直接進(jìn)行比較:
<?php if ($start < $end) { echo "Start is before the end!\n"; }
最后一個(gè)例子來(lái)演示 DatePeriod 類(lèi)。它用來(lái)對(duì)循環(huán)的事件進(jìn)行迭代。向它傳入開(kāi)始時(shí)間、結(jié)束時(shí)間和間隔區(qū)間,會(huì)得到這其中所有的事件。
<?php // output all thursdays between $start and $end $periodInterval = DateInterval::createFromDateString('first thursday'); $periodIterator = new DatePeriod($start, $periodInterval, $end, DatePeriod::EXCLUDE_START_DATE); foreach ($periodIterator as $date) { // output each date in the period echo $date->format('Y-m-d') . ' '; }
Carbon 是一個(gè)很受歡迎的 PHP API 擴(kuò)展。它繼承了 DateTime 類(lèi)的所有功能,因此只需修改很少的代碼就可以使用更多額外的功能,例如支持本地化、日期加減以及格式化 Datetime 對(duì)象,另外還能根據(jù)你的選擇來(lái)模擬日期和時(shí)間并測(cè)試你的代碼。