两个日期之间的PHP周

ArK*_*ArK 34 php date

您好如何在两个日期之间找不到星期和每个星期一的日期.从前10-07-2009到今天.

注意:考虑闰年和其他日期相关的约束.

vas*_*ite 69

以下是使用DateTime的替代解决方案: -

function datediffInWeeks($date1, $date2)
{
    if($date1 > $date2) return datediffInWeeks($date2, $date1);
    $first = DateTime::createFromFormat('m/d/Y', $date1);
    $second = DateTime::createFromFormat('m/d/Y', $date2);
    return floor($first->diff($second)->days/7);
}

var_dump(datediffInWeeks('1/2/2013', '6/4/2013'));// 21
Run Code Online (Sandbox Code Playgroud)

看它工作

  • @Aukhan然后随意修改它以适应:)这里发布的代码片段无法适合每个场景,它们仅仅是建议的起点.也许[`round()`](http://php.net/round)会更适合你? (3认同)
  • 我认为这个答案比接受的更完整,特别是如果@Piskvor说的话比dateiff有bug. (2认同)

Tom*_*len 20

echo datediff('ww', '9 July 2003', '4 March 2004', false);
Run Code Online (Sandbox Code Playgroud)

在以下网站上找到该功能:http: //www.addedbytes.com/code/php-datediff-function/

UPDATE

链接现在已经破了(2017年9月),所以下面的功能来自webarchive:

<?php

/**
 * @param $interval
 * @param $datefrom
 * @param $dateto
 * @param bool $using_timestamps
 * @return false|float|int|string
 */
function datediff($interval, $datefrom, $dateto, $using_timestamps = false)
{
    /*
    $interval can be:
    yyyy - Number of full years
    q    - Number of full quarters
    m    - Number of full months
    y    - Difference between day numbers
           (eg 1st Jan 2004 is "1", the first day. 2nd Feb 2003 is "33". The datediff is "-32".)
    d    - Number of full days
    w    - Number of full weekdays
    ww   - Number of full weeks
    h    - Number of full hours
    n    - Number of full minutes
    s    - Number of full seconds (default)
    */

    if (!$using_timestamps) {
        $datefrom = strtotime($datefrom, 0);
        $dateto   = strtotime($dateto, 0);
    }

    $difference        = $dateto - $datefrom; // Difference in seconds
    $months_difference = 0;

    switch ($interval) {
        case 'yyyy': // Number of full years
            $years_difference = floor($difference / 31536000);
            if (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom), date("j", $datefrom), date("Y", $datefrom)+$years_difference) > $dateto) {
                $years_difference--;
            }

            if (mktime(date("H", $dateto), date("i", $dateto), date("s", $dateto), date("n", $dateto), date("j", $dateto), date("Y", $dateto)-($years_difference+1)) > $datefrom) {
                $years_difference++;
            }

            $datediff = $years_difference;
        break;

        case "q": // Number of full quarters
            $quarters_difference = floor($difference / 8035200);

            while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($quarters_difference*3), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
                $months_difference++;
            }

            $quarters_difference--;
            $datediff = $quarters_difference;
        break;

        case "m": // Number of full months
            $months_difference = floor($difference / 2678400);

            while (mktime(date("H", $datefrom), date("i", $datefrom), date("s", $datefrom), date("n", $datefrom)+($months_difference), date("j", $dateto), date("Y", $datefrom)) < $dateto) {
                $months_difference++;
            }

            $months_difference--;

            $datediff = $months_difference;
        break;

        case 'y': // Difference between day numbers
            $datediff = date("z", $dateto) - date("z", $datefrom);
        break;

        case "d": // Number of full days
            $datediff = floor($difference / 86400);
        break;

        case "w": // Number of full weekdays
            $days_difference  = floor($difference / 86400);
            $weeks_difference = floor($days_difference / 7); // Complete weeks
            $first_day        = date("w", $datefrom);
            $days_remainder   = floor($days_difference % 7);
            $odd_days         = $first_day + $days_remainder; // Do we have a Saturday or Sunday in the remainder?

            if ($odd_days > 7) { // Sunday
                $days_remainder--;
            }

            if ($odd_days > 6) { // Saturday
                $days_remainder--;
            }

            $datediff = ($weeks_difference * 5) + $days_remainder;
        break;

        case "ww": // Number of full weeks
            $datediff = floor($difference / 604800);
        break;

        case "h": // Number of full hours
            $datediff = floor($difference / 3600);
        break;

        case "n": // Number of full minutes
            $datediff = floor($difference / 60);
        break;

        default: // Number of full seconds (default)
            $datediff = $difference;
        break;
    }

    return $datediff;
}
Run Code Online (Sandbox Code Playgroud)

  • 我到底是怎么搜索函数来找到两个日期之间的差异,并最终得到StackOverflow ...阅读链接到我自己的网站的评论和我已经编写的代码来解决这个问题?我想我正在失去它...... (9认同)
  • 如果你包含`datediff`的代码会很好,以防链接失效. (4认同)
  • 如果不是因为包括2012(以及2016年,2020年和2024年)在内的许多范围内的一个不那么微妙的错误,那将是很好的:2月29日. (3认同)

sil*_*ent 20

$diff = strtotime($dateto, 0) - strtotime($datefrom, 0);
echo floor($diff / 604800);
Run Code Online (Sandbox Code Playgroud)