當前位置: 首頁>>編程語言>>正文


PHP處理日期和時間

本文摘譯整理自PHP最佳實踐-PHP處理日期和時間。

使用DateTime 類。

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

幸運的是,我們正在討論的 PHP 版本包含友好得多的 DateTime 類。 該類封裝了老式日期函數所有功能,甚至更多,在一個易於使用的類中,並且使得時區轉換更加容易。 在PHP中始終使用 DateTime 類來創建,比較,改變以及展示日期。

示例

<?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.');
?>

可能踩的坑

  • 如果你不指定一個時區,DateTime::__construct() 就會將生成日期的時區設置為正在運行的計算機的時區。之後,這會導致大量令人頭疼的事情。 在創建新日期時始終指定 UTC 時區,除非你確實清楚自己在做的事情。
  • 如果你在 DateTime::__construct() 中使用 Unix 時間戳,那麽時區將始終設置為 UTC 而不管第二個參數你指定了什麽。
  • 向 DateTime::__construct() 傳遞零值日期(如:“0000-00-00”,常見 MySQL 生成該值作為 DateTime 類型數據列的默認值)會產生一個無意義的日期,而不是“0000-00-00”。
  • 在 32 位係統上使用 DateTime::getTimestamp() 不會產生代表 2038 年之後日期的時間戳。64 位係統則沒有問題。

進一步閱讀

本文由《純淨天空》出品。文章地址: https://vimsky.com/zh-tw/article/1726.html,未經允許,請勿轉載。