首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 入門

PHP date() 函數完整指南:日期時間格式化、時間戳操作與實務技巧

     編輯:PHP 入門

PHP date() 函數完整指南

date() 是 PHP 處理日期時間最核心的函數,將 Unix 時間戳格式化為人類可讀字串。掌握格式字元、時區處理、常見陷阱,能高效解決各類時間顯示需求。

基本語法

date(string $format, int $timestamp = time()): string
  • $format:格式字串(必填)
  • $timestamp:Unix 時間戳(選填,預設為當前 time())

常用格式字元速查表

字元說明範例
Y4位數年份2024
y2位數年份24
m月份(有前導零)01-12
n月份(無前導零)1-12
F月份完整名稱January
M月份縮寫Jan
d日期(有前導零)01-31
j日期(無前導零)1-31
l星期完整名稱Monday
D星期縮寫Mon
w星期數字0(日)-6(六)
NISO-8601 星期1(一)-7(日)
H24小時制(有前導零)00-23
G24小時制(無前導零)0-23
h12小時制(有前導零)01-12
g12小時制(無前導零)1-12
i分鐘(有前導零)00-59
s秒數(有前導零)00-59
u微秒000000
aam/pm 小寫am
AAM/PM 大寫PM
z年間第幾天0-365
WISO-8601 週數42
t該月天數28-31
L是否閏年1/0
cISO 8601 格式2024-01-15T14:30:00+08:00
rRFC 2822 格式Mon, 15 Jan 2024 14:30:00 +0800
UUnix 時間戳1705300200

常見格式範例

<?php
$now = time();

echo date("Y-m-d", $now);           // 2024-01-15
echo date("Y/m/d H:i:s", $now);     // 2024/01/15 14:30:00
echo date("Y年m月d日 l", $now);     // 2024年01月15日 Monday
echo date("c", $now);               // 2024-01-15T14:30:00+08:00 (ISO 8601)
echo date("r", $now);               // Mon, 15 Jan 2024 14:30:00 +0800 (RFC 2822)
echo date("U", $now);               // 1705300200 (時間戳)
?>

時區處理:關鍵設定

PHP 預設時區可能非預期值,必須明確設定:

<?php
// 方法 1:php.ini 設定
// date.timezone = "Asia/Taipei"

// 方法 2:腳本開頭設定(推薦)
date_default_timezone_set('Asia/Taipei');

// 方法 3:ini_set
ini_set('date.timezone', 'Asia/Taipei');

// 驗證
echo date_default_timezone_get(); // Asia/Taipei
echo date('Y-m-d H:i:s T');       // 2024-01-15 14:30:00 CST
?>

常用時區識別碼:Asia/Taipei、Asia/Shanghai、Asia/Hong_Kong、UTC、America/New_York、Europe/London。

時間戳操作:strtotime()

將英文文字日期描述解析為 Unix 時間戳。

<?php
echo strtotime("now");           // 當前時間戳
echo strtotime("+1 day");        // 明天這個時間
echo strtotime("next Monday");   // 下週一
echo strtotime("last day of February 2024"); // 2024-02-29
echo strtotime("2024-12-25");    // 指定日期
echo strtotime("-2 weeks");      // 兩週前

// 結合 date()
echo date("Y-m-d", strtotime("+1 month")); // 下個月今天
?>

DateTime 類別:現代物件導向介面

PHP 5.2+ 提供 DateTime,功能更強大、處理時區更直觀、支援微秒。

<?php
// 建立
$dt = new DateTime('now', new DateTimeZone('Asia/Taipei'));
$dt2 = DateTime::createFromFormat('Y-m-d', '2024-12-25');

// 格式化
echo $dt->format('Y-m-d H:i:s');
echo $dt->format('c');

// 修改
$dt->modify('+1 week');
$dt->add(new DateInterval('P3D')); // 加 3 天
$dt->sub(new DateInterval('P1M')); // 減 1 月

// 比較
$diff = $dt1->diff($dt2);
echo $diff->days . " 天差異";
echo $diff->format('%R%a 天');

// 時區轉換
$dt->setTimezone(new DateTimeZone('UTC'));
echo $dt->format('c');
?>

實務常見需求解決方案

1. 計算年齡

function calculateAge($birthDate) {
    $birth = new DateTime($birthDate);
    $today = new DateTime('today');
    $diff = $birth->diff($today);
    return $diff->y;
}
echo calculateAge('1990-05-15'); // 33 (視當前日期)

2. 取得本月第一天/最後一天

$firstDay = date('Y-m-01');
$lastDay = date('Y-m-t');
// 或
$dt = new DateTime('first day of this month');
$dtEnd = new DateTime('last day of this month');

3. 判斷是否為今天/本週/本月

function isToday($timestamp) {
    return date('Y-m-d', $timestamp) === date('Y-m-d');
}

function isThisWeek($timestamp) {
    return date('o-W', $timestamp) === date('o-W');
    // 'o' 為 ISO 年份,配合 'W' 週數
}

4. 友善相對時間顯示(幾分鐘前、幾小時前)

function timeAgo($timestamp) {
    $diff = time() - $timestamp;
    if ($diff < 60) return "剛剛";
    if ($diff < 3600) return floor($diff/60) . " 分鐘前";
    if ($diff < 86400) return floor($diff/3600) . " 小時前";
    if ($diff < 604800) return floor($diff/86400) . " 天前";
    return date('Y-m-d', $timestamp);
}

5. 微秒精度(需 DateTime)

$dt = new DateTime();
echo $dt->format('Y-m-d H:i:s.u'); // 2024-01-15 14:30:00.123456
// date('u') 永遠回傳 000000

常見陷阱與注意事項

  1. 未設定時區:導致時間偏移、警告訊息
  2. date('u') 無微秒:需用 DateTime::format('u') 或 microtime(true)
  3. strtotime 解析歧義:02/03/2024 美式為 3月2日,歐式為 2月3日。建議使用 ISO 格式 2024-03-02 或 DateTime::createFromFormat()
  4. 閏秒、夏令時間:DateTime 內建處理,手動計算易出錯
  5. 32位系統 2038 年問題:時間戳溢位,64位系統或 DateTime 可避免

效能建議

  • 高頻呼叫緩存 time() 結果
  • 批次格式化考慮 DateTime 物件重用
  • 資料庫層面處理時區轉換(存 UTC,顯示時轉換)

日期時間處理看似簡單,實則涉及時區、語系、曆法、閏年等複雜性。善用 DateTime 類別、明確設定時區、避免手動運算,是構建可靠時間功能的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved