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

PHP 根據年份第幾天計算日期 (年月日) 的方法

     編輯:PHP 綜合知識

PHP date('z') 回傳某日期是當年的第幾天 (0 起算,0 表 1 月 1 日)。若已知年份與第 N 天 (0-based),需反推具體日期,可利用 Unix Timestamp 運算快速達成。

核心邏輯

  1. 取得該年 1 月 1 日 00:00:00 的 Unix Timestamp:mktime(0, 0, 0, 1, 1, $year)。
  2. 加上天數對應的秒數:$dayOfYear * 86400 (一天 86400 秒)。
  3. 用 date() 格式化輸出目標日期。

程式碼範例

<?php
/**
 * 根據年份與第幾天 (0-based) 計算日期
 *
 * @param int $year 年份,如 2024
 * @param int $dayOfYear 第幾天,0 表示 1 月 1 日,範圍 0-364 (閏年 0-365)
 * @return string 格式化日期字串,預設 'Y-m-d'
 */
function getDateFromDayOfYear(int $year, int $dayOfYear, string $format = 'Y-m-d'): string
{
    // 基準時間:該年 1 月 1 日 00:00:00
    $baseTimestamp = mktime(0, 0, 0, 1, 1, $year);

    // 目標時間戳
    $targetTimestamp = $baseTimestamp + $dayOfYear * 86400;

    // 格式化輸出
    return date($format, $targetTimestamp);
}

// 測試
$year = 2008; // 閏年
$day = 159;   // 第 159 天 (0-based) = 實際第 160 天
echo getDateFromDayOfYear($year, $day, 'Y-m-d (l)'); 
// 輸出: 2008-06-08 (Sunday)

// 驗證:直接用 mktime 指定月日
echo "\n驗證: " . date('Y-m-d', mktime(0,0,0,6,8,2008)); // 2008-06-08
?>

進階:DateTime 物件導向寫法 (PHP 5.2+ 推薦)

DateTime 處理時區、閏年、閏秒更健壯,支援鏈式操作。

<?php
function getDateFromDayOfYearDt(int $year, int $dayOfYear, string $format = 'Y-m-d', ?DateTimeZone $tz = null): string
{
    $dt = new DateTime("{$year}-01-01 00:00:00", $tz);
    $dt->add(new DateInterval("P{$dayOfYear}D")); // 加 N 天
    return $dt->format($format);
}

// 測試
echo getDateFromDayOfYearDt(2008, 159, 'Y-m-d (l)'); // 2008-06-08 (Sunday)

// 含時區範例
$tz = new DateTimeZone('Asia/Taipei');
echo getDateFromDayOfYearDt(2024, 0, 'Y-m-d H:i:s T', $tz); // 2024-01-01 00:00:00 CST
?>

注意事項

  • 0-based vs 1-based:date('z') 回傳 0-based。若來源為 1-based (如人類口語「第 1 天」),需先 -1。
  • 閏年邊界:閏年 2 月 29 日 為第 59 天 (0-based),全年 366 天 (0-365)。輸入超出範圍會自動進入下一年 (mktime/DateTime 會正常溢位)。
  • 時區:mktime 使用預設時區 (date_default_timezone_set)。跨時區應用請改用 DateTime 明確指定 DateTimeZone。
  • 效能:單次計算差異極微。高頻迴圈 (百萬次) 下 mktime 稍快,但 DateTime 正確性更高,建議優先使用 DateTime。

應用場景

  • 日曆系統:快速定位「第 N 天」對應日期。
  • 統計報表:將「年度第 N 天」匯總鍵值轉為可讀日期。
  • 排程任務:根據年度天數觸發特定邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved