Php 查找一个月的每周周期(从周一开始)

Php 查找一个月的每周周期(从周一开始),php,time,duration,period,week-number,Php,Time,Duration,Period,Week Number,我试图找出给定月份和年份的周周期。日期应从周一开始,周日结束。如果一个月的第一个月是2011年5月前的星期日,那么它应该是第一个元素 2011年5月 五月一日星期日 5月2日至5月8日星期一至星期日 5月9日至5月15日星期一至星期日 五月十七日至五月二十二日星期一至星期日 五月二十三日至二十九日星期一至星期日 5月30日至5月31日星期一至星期二 2012年9月 九月一日至九月二日 九月三日至九月九日 九月十日至九月十六日 九月十七日至二十三日 九月二十四日至三十日 我使用此函数计算两个日期的

我试图找出给定月份和年份的周周期。日期应从周一开始,周日结束。如果一个月的第一个月是2011年5月前的星期日,那么它应该是第一个元素

2011年5月

五月一日星期日 5月2日至5月8日星期一至星期日 5月9日至5月15日星期一至星期日 五月十七日至五月二十二日星期一至星期日 五月二十三日至二十九日星期一至星期日 5月30日至5月31日星期一至星期二 2012年9月

九月一日至九月二日 九月三日至九月九日 九月十日至九月十六日 九月十七日至二十三日 九月二十四日至三十日 我使用此函数计算两个日期的周数-即每月第一天和每月最后一天

public function getWeekNumbers($startDate, $endDate)
{
    $p = new DatePeriod(
            new DateTime($startDate),
            new DateInterval('P1W'),
            new DateTime($endDate)
    );

    $weekNumberList = array();

    foreach ($p as $w)
    {
        $weekNumber = $w->format('W');
        $weekNumberList[] = ltrim($weekNumber, '0');
    }

    return $weekNumberList;
}
奇怪的是,对于1月份,当我期待[1,2,3,4,5]时,它返回的周数是[52,1,2,3,4]

一旦我有了周数,我就会像这样使用它们:

//The following loop will populate the dataset with the entire month's durations - regardless if hours were worked or not.
    $firstDayOfMonth = date('Y-m-d', strtotime("first day of {$this->year}-{$monthName}"));
    $lastDayOfMonth = date('Y-m-d', strtotime("last day of {$this->year}-{$monthName}"));

    foreach ($this->getWeekNumbers($firstDayOfMonth, $lastDayOfMonth) as $key => $weekId)
    {
        // find first mоnday of the year
        $firstMon = strtotime("mon jan {$this->year}");

        // calculate how many weeks to add
        $weeksOffset = $weekId - date('W', $firstMon);

        $beginDays = $weeksOffset * 7;
        $endDays = ($weeksOffset * 7) + 6;

        $searchedMon = strtotime(date('Y-m-d', $firstMon) . " +{$beginDays} days");
        $searchedSun = strtotime(date('Y-m-d', $firstMon) . " +{$endDays} days");

        echo date("M d", $searchedMon) . " - " . date("M d", $searchedSun);
    }
由于getWeekNumbers函数没有返回我期望的周数,因此上述函数的输出是

2012年12月24日至12月30日 2012年1月2日至8日 2012年1月9日至1月15日 2012年1月16日至22日 2012年1月23日至29日 请注意,第1行12月24日至12月30日是2012年本年度末,而不是2011年上一年度末

理想情况下,我希望它看起来像


有什么想法吗?谢谢

这很好用!!!菲德尔


这工作完美!!!菲德尔


以下假设用户可以选择要运行报告的月份和年份,发布值为1-12表示月份,YYYY表示年份。也许有一种更优雅的方法可以做到这一点,但这似乎适合我。此外,在你的帖子顶部,你说你希望这几周是周一到周日。然而,底部的示例/屏幕截图显示了从周日到周六的几个星期。以下是原定周一至周日的目标

$month = $_POST["month"];
$year = $_POST["year"];

$endDate = date("t", strtotime($year."-".$month."-01"));

$dayOfWeekOfFirstOfMonth = date("w", strtotime($year."-".$month."-01"));
$lastDayOfFirstWeek = 8 - $dayOfWeekOfFirstOfMonth;

$weeksArray = array(array("firstDay"=>1, "lastDay"=>$lastDayOfFirstWeek));

$loopDate = $lastDayOfFirstWeek + 1;

while($loopDate < $endDate)
{
    $weeksArray[] = array("firstDay"=>$loopDate, "lastDay"=>($loopDate+6 > $endDate ? $endDate : $loopDate+6));
    $loopDate+=7;
}

foreach($weeksArray as $week)
{
    echo date("M d", strtotime($year."-".$month."-".$week["firstDay"])) . " - " . date("M d", strtotime($year."-".$month."-".$week["lastDay"])) . "\n";
}

以下假设用户可以选择要运行报告的月份和年份,发布值为1-12表示月份,YYYY表示年份。也许有一种更优雅的方法可以做到这一点,但这似乎适合我。此外,在你的帖子顶部,你说你希望这几周是周一到周日。然而,底部的示例/屏幕截图显示了从周日到周六的几个星期。以下是原定周一至周日的目标

$month = $_POST["month"];
$year = $_POST["year"];

$endDate = date("t", strtotime($year."-".$month."-01"));

$dayOfWeekOfFirstOfMonth = date("w", strtotime($year."-".$month."-01"));
$lastDayOfFirstWeek = 8 - $dayOfWeekOfFirstOfMonth;

$weeksArray = array(array("firstDay"=>1, "lastDay"=>$lastDayOfFirstWeek));

$loopDate = $lastDayOfFirstWeek + 1;

while($loopDate < $endDate)
{
    $weeksArray[] = array("firstDay"=>$loopDate, "lastDay"=>($loopDate+6 > $endDate ? $endDate : $loopDate+6));
    $loopDate+=7;
}

foreach($weeksArray as $week)
{
    echo date("M d", strtotime($year."-".$month."-".$week["firstDay"])) . " - " . date("M d", strtotime($year."-".$month."-".$week["lastDay"])) . "\n";
}

如果您需要所选月份的所有周,以及所选周的所有日期,则以下是您所需的全部内容:

function getWeekDays($month, $year)
{
    $p = new DatePeriod(
        DateTime::createFromFormat('!Y-n-d', "$year-$month-01"),
        new DateInterval('P1D'),
        DateTime::createFromFormat('!Y-n-d', "$year-$month-01")->add(new DateInterval('P1M'))
    );

    $datesByWeek = array();
    foreach ($p as $d) {
        $dateByWeek[ $d->format('W') ][] = $d;
    }
    return $dateByWeek;
}
getWeekDays函数返回多维数组。第一个关键是周数。2级是数组,它将日期保存为DateTime对象

获取示例:

print_r( getWeekDays(5, 2011) ); # May 2011
print_r( getWeekDays(9, 2012) ); # Sep 2012
我有一点额外的时间,所以我写了一个例子-

$datesByWeek = getWeekDays(8, 2012);
$o = '<table border="1">';
$o.= '<tr><th>Week</th><th>Monday</th><th>Tuesday</th><th>Wednesday</th><th>Thursday</th><th>Friday</th><th>Saturday</th><th>Sunday</th></tr>';
foreach ($datesByWeek as $week => $dates) {
    $firstD = $dates[0];
    $lastD = $dates[count($dates)-1];

    $o.= "<tr>";
    $o.= "<td>" . $firstD->format('M d') . ' - ' . $lastD->format('M d') . "</td>";
    $N = $firstD->format('N');
    for ($i = 1; $i < $N; $i++) {
        $o.= "<td>-</td>";
    }
    foreach ($dates as $d) {
        $o.= "<td>" . $d->format('d.') . " / 0.00</td>";
            # for selected date do you magic
    }
    $N = $lastD->format('N');
    for ($i = $N; $i < 7; $i++) {
        $o.= "<td>-</td>";
    }
    $o.= "</tr>";
}
$o.= '</table>';
echo $o;
输出如下所示:

如果您需要所选月份的所有周,以及所选周的所有日期,那么这就是您所需要的全部:

function getWeekDays($month, $year)
{
    $p = new DatePeriod(
        DateTime::createFromFormat('!Y-n-d', "$year-$month-01"),
        new DateInterval('P1D'),
        DateTime::createFromFormat('!Y-n-d', "$year-$month-01")->add(new DateInterval('P1M'))
    );

    $datesByWeek = array();
    foreach ($p as $d) {
        $dateByWeek[ $d->format('W') ][] = $d;
    }
    return $dateByWeek;
}
getWeekDays函数返回多维数组。第一个关键是周数。2级是数组,它将日期保存为DateTime对象

获取示例:

print_r( getWeekDays(5, 2011) ); # May 2011
print_r( getWeekDays(9, 2012) ); # Sep 2012
我有一点额外的时间,所以我写了一个例子-

$datesByWeek = getWeekDays(8, 2012);
$o = '<table border="1">';
$o.= '<tr><th>Week</th><th>Monday</th><th>Tuesday</th><th>Wednesday</th><th>Thursday</th><th>Friday</th><th>Saturday</th><th>Sunday</th></tr>';
foreach ($datesByWeek as $week => $dates) {
    $firstD = $dates[0];
    $lastD = $dates[count($dates)-1];

    $o.= "<tr>";
    $o.= "<td>" . $firstD->format('M d') . ' - ' . $lastD->format('M d') . "</td>";
    $N = $firstD->format('N');
    for ($i = 1; $i < $N; $i++) {
        $o.= "<td>-</td>";
    }
    foreach ($dates as $d) {
        $o.= "<td>" . $d->format('d.') . " / 0.00</td>";
            # for selected date do you magic
    }
    $N = $lastD->format('N');
    for ($i = $N; $i < 7; $i++) {
        $o.= "<td>-</td>";
    }
    $o.= "</tr>";
}
$o.= '</table>';
echo $o;
输出如下所示:

您的问题解决了吗?如果他们有用的话,你可以在这里投票。您可以选择一个anwser作为关闭问题的anwser。但在另一种情况下,你可以发布你自己的anwser来分享问题是如何解决的。你解决问题了吗?如果他们有用的话,你可以在这里投票。您可以选择一个anwser作为关闭问题的anwser。但在另一种情况下,你可以发布你自己的anwser来分享这个问题是如何解决的。哇-这非常有效!非常感谢你的时间和努力。哇-这非常有效!非常感谢你的时间和努力。