計算一年第 n 天或第 n 週的日期

edited 十月 2013 in 進階PHP討論
剛剛在找怎麼查出第 n 週的開始與結束日期,因為腦子裡想到的都是迴圈來、迴圈去,後來在這兒發現答案:
http://tw.php.net/manual/tw/function.date.php#73798
function week_limits($weekNumber, $year, $pattern)
{
    $pattern = ($pattern) ? $pattern : "m/d";
    $stday = 7 * $weekNumber - 7;
    $stDayNumber = date("w", mktime(0,0,0,1, 1+$stday, $year));
    $stUtime = mktime(0,0,0,1,1+$stday-$stDayNumber, $year);
    $start_time = date($pattern, $stUtime);
    $end_time = date($pattern, $stUtime+6*24*60*60);
   return array($start_time, $end_time);
}//week_limits()

也意外發現,原來 mktime() 可以這樣子用
date('Y-m-d', mktime(0,0,0,1, 32, 2008);

2008-01-32 ? no ,輸出是 2008-02-01,所以透過 mktime() 就可以輕易算出一年第 n 天的日期,當然我要的答案也容易多了。

還有這種:
echo date('Y-m-d', mktime(0,0,0,1,-1, 2008));

輸出為 2007-12-30 ,神奇吧

原始討論: http://twpug.net/x/modules/newbb/viewtopic.php?topic_id=3150

評論

  • edited 一月 2008
    寫了一個單純些的函式來計算每週的開始與結束時間:
    function getWeekEdge($weekNumber, $year) {
            // Dow == Day of week
            $yearFirstDow = date('w', mktime(0,0,0,1,1,$year));
            $sameDowTime = mktime(0,0,0,1, ($yearFirstDow + ($weekNumber - 1) * 7) - 1, $year);
            $firstDowTime = $sameDowTime - (($yearFirstDow - 1) * 24 * 60 * 60);
            $lastDowTime = $sameDowTime + ((7 - $yearFirstDow + 1) * 24 * 60 * 60) - 1;
            return array(
                'start' => $firstDowTime,
                'end'  => $lastDowTime,
            );
        }
    

    24 * 60 * 60 是為了讓人看懂,想要快些就改成 86400 吧 :)
  • edited 一月 2008
    計算日期時千萬不要用86400 或24 * 60 * 60
    因為這種計算方式在系統使用日光節約時間時
    會計算錯誤
  • edited 一月 2008
    恩,因為我的應用比較單純,所以不會遇到日光節約時間的問題 :)
Sign In or Register to comment.