鍍金池/ 教程/ PHP/ 處理日期和時間
驗(yàn)證郵件地址
自動加載類
PHP 與 MySQL
緩存 PHP opcode
檢測一個值是否為 null 或 false
PHP 標(biāo)簽
從性能角度來看單引號和雙引號
發(fā)送郵件
處理日期和時間
define() vs. const
配置 Web 服務(wù)器提供 PHP 服務(wù)
PHP 與 UTF-8
我們在使用哪個版本的 PHP?
凈化 HTML 輸入和輸出
PHP 與正則表達(dá)式
存儲密碼
PHP 與 Memcached

處理日期和時間

使用DateTime 類。

在 PHP 糟糕的老時光里,我們必須使用 date(), gmdate(), date_timezone_set(), strtotime()等等令人迷惑的 組合來處理日期和時間。悲哀的是現(xiàn)在你仍舊會找到很多在線教程在講述這些不易使用的老式函數(shù)。

幸運(yùn)的是,我們正在討論的 PHP 版本包含友好得多的 DateTime 類。 該類封裝了老式日期函數(shù)所有功能,甚至更多,在一個易于使用的類中,并且使得時區(qū)轉(zhuǎn)換更加容易。 在PHP中始終使用 DateTime 類來創(chuàng)建,比較,改變以及展示日期。

示例

<?php
// Construct a new UTC date.  Always specify UTC unless you really know what you're doing!
$date = new DateTime('2011-05-04 05:00:00', new DateTimeZone('UTC'));

// Add ten days to our initial date
$date->add(new DateInterval('P10D'));

echo($date->format('Y-m-d h:i:s')); // 2011-05-14 05:00:00

// Sadly we don't have a Middle Earth timezone
// Convert our UTC date to the PST (or PDT, depending) time zone
$date->setTimezone(new DateTimeZone('America/Los_Angeles'));

// Note that if you run this line yourself, it might differ by an hour depending on daylight savings
echo($date->format('Y-m-d h:i:s')); // 2011-05-13 10:00:00

$later = new DateTime('2012-05-20', new DateTimeZone('UTC'));

// Compare two dates
if($date < $later)
    echo('Yup, you can compare dates using these easy operators!');

// Find the difference between two dates
$difference = $date->diff($later);

echo('The 2nd date is ' . $difference['days'] . ' later than 1st date.');
?>

陷阱

  • 如果你不指定一個時區(qū),DateTime::__construct() 就會將生成日期的時區(qū)設(shè)置為正在運(yùn)行的計(jì)算機(jī)的時區(qū)。之后,這會導(dǎo)致大量令人頭疼的事情。 在創(chuàng)建新日期時始終指定 UTC 時區(qū),除非你確實(shí)清楚自己在做的事情。

  • 如果你在 DateTime::__construct() 中使用 Unix 時間戳,那么時區(qū)將始終設(shè)置為 UTC 而不管第二個參數(shù)你指定了什么。

  • 向 DateTime::__construct() 傳遞零值日期(如:“0000-00-00”,常見 MySQL 生成該值作為 DateTime 類型數(shù)據(jù)列的默認(rèn)值)會產(chǎn)生一個無意義的日期,而不是“0000-00-00”。

  • 在 32 位系統(tǒng)上使用 DateTime::getTimestamp() 不會產(chǎn)生代表 2038 年之后日期的時間戳。64 位系統(tǒng)則沒有問題。

進(jìn)一步閱讀