PHP實現上一周,上N周,上個月,上個季度


本文目的

今天實現了題目中描述的關於上XX時間的函數,這幾個函數大量的使用了php日期時間相關的函數,尤其是date,所以記錄於此,作為備忘錄,也希望對其他同學有用。

 

上代碼

<?php
/**
 * 上XXX時間函數,用於計算上一周,上n周,上個月,上個季度的時間點。
 *
 * @author bourneli(李伯韜)
 * @date 2012-12-18
 */

/**
 * 獲取上個季度的開始和結束日期
 * @param int $ts 時間戳
 * @return array 第一個元素為開始日期,第二個元素為結束日期
 */
function lastQuarter($ts) {
    $ts = intval($ts);

    $threeMonthAgo = mktime(0, 0, 0, date('n', $ts) - 3, 1, date('Y', $ts));
    $year = date('Y', $threeMonthAgo);
    $month = date('n', $threeMonthAgo);
    $startMonth = intval(($month - 1)/3)*3 + 1; // 上季度開始月份
    $endMonth = $startMonth + 2; // 上季度結束月份
    return array(
        date('Y-m-1', strtotime($year . "-{$startMonth}-1")),
        date('Y-m-t', strtotime($year . "-{$endMonth}-1"))
    );
}

/**
 * 獲取上個月的開始和結束
 * @param int $ts 時間戳
 * @return array 第一個元素為開始日期,第二個元素為結束日期
 */
function lastMonth($ts) {
    $ts = intval($ts);

    $oneMonthAgo = mktime(0, 0, 0, date('n', $ts) - 1, 1, date('Y', $ts));
    $year = date('Y', $oneMonthAgo);
    $month = date('n', $oneMonthAgo);
    return array(
        date('Y-m-1', strtotime($year . "-{$month}-1")),
        date('Y-m-t', strtotime($year . "-{$month}-1"))
    );
}

/**
 * 獲取上n周的開始和結束,每周從周一開始,周日結束日期
 * @param int $ts 時間戳
 * @param int $n 你懂的(前多少周)
 * @param string $format 默認為'%Y-%m-%d',比如"2012-12-18"
 * @return array 第一個元素為開始日期,第二個元素為結束日期
 */
function lastNWeek($ts, $n, $format = '%Y-%m-%d') {
    $ts = intval($ts);
    $n  = abs(intval($n));

    // 周一到周日分別為1-7
    $dayOfWeek = date('w', $ts);
    if (0 == $dayOfWeek)
    {
        $dayOfWeek = 7;
    }

    $lastNMonday = 7 * $n + $dayOfWeek - 1;
    $lastNSunday = 7 * ($n - 1) + $dayOfWeek;
    return array(
        strftime($format, strtotime("-{$lastNMonday} day", $ts)),
        strftime($format, strtotime("-{$lastNSunday} day", $ts))
    );
}

//---------------------demo---------------------
$now = strftime('%Y-%m-%d', time());
echo "Today: {$now}\n";

list($start, $end) = lastNWeek(time(), 1);
echo "Last 1 week:  {$start} ~ {$end}\n";

list($start, $end) = lastNWeek(time(), 2);
echo "Last 2 week:  {$start} ~ {$end}\n";

list($start, $end) = lastNWeek(time(), 3);
echo "Last 3 week:  {$start} ~ {$end}\n";

list($start, $end) = lastMonth(time());
echo "Last month:   {$start} ~ {$end}\n";

list($start, $end) = lastQuarter(time());
echo "Last quarter: {$start} ~ {$end}\n";

?>

(前N個月,只需要稍作修改,就可以實現,這里就留給讀者了。)

執行結果如下:

image

 

參考資料


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM