在 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”。