PHP date('z') 回傳某日期是當年的第幾天 (0 起算,0 表 1 月 1 日)。若已知年份與第 N 天 (0-based),需反推具體日期,可利用 Unix Timestamp 運算快速達成。
mktime(0, 0, 0, 1, 1, $year)。$dayOfYear * 86400 (一天 86400 秒)。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
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
?>
date('z') 回傳 0-based。若來源為 1-based (如人類口語「第 1 天」),需先 -1。mktime 使用預設時區 (date_default_timezone_set)。跨時區應用請改用 DateTime 明確指定 DateTimeZone。mktime 稍快,但 DateTime 正確性更高,建議優先使用 DateTime。