在php中根据另一天的日期查找星期一的日期

时间:2011-05-12 15:34:22

标签: php date

我需要找到一种方法来获取基于另一天的星期一的日期。所以例如,如果星期三是2011-05-11,我需要以某种方式告诉它那周的星期一是2011-05-09。有人可以帮忙吗?

$res看起来像这样:

stdClass Object
        (
            [link_count] => 1
            [day] => 2011-05-12
            [weekday] => Thu
        )

    $days = array(1=> 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun');
    foreach($res as $r) {
        $day = date('N', strtotime($r->day));
        $r->weekday = $days[$day];
        if($r->weekday == 'Mon') {
            $r->weekstarting = $r->day;
        } else {
            // here's the problem right here, I need to find a way to tell it 
            // what it's starting day is
            $r->weekstarting = ;
        }

    }

4 个答案:

答案 0 :(得分:1)

这似乎工作正常:

<?php

$dt = new DateTime("11 May 2011");
$dt->modify("last monday");

编辑:我记得看到有些人在使用“最后一个”修饰符时遇到问题的报告(可能是Windows用户),所以如果你遇到问题,这应该有用:

<?php

$dt = new DateTime("12 May 2011");
$days = (int)$dt->format('N') - 1;
$dt->modify("-{$days} days");

答案 1 :(得分:1)

好像你有工作日(比如'Thu'),所以你需要获得$days数组中的位置。

您可以使用$key=array_search($r->weekday, $days);获取密钥(返回4)。

现在您知道与周一的区别,所以您只需要创建日期:

$tempArray=explode('-', $r->day);
$tempArray[2]-=$key-1;
$r->weekstarting = implode('-', $tempArray);

编辑:现在我看到您已经在$day中拥有了数组索引。因此,您可以使用该值而不是我拥有的$key

编辑2:如果您不想在当天丢失前导零,则可以使用sprintf()

$tempArray=explode('-', $r->day);
$tempArray[2]=sprintf('%02d', $tempArray[2]-($key-1));
$r->weekstarting = implode('-', $tempArray);

最后最后更新。我正考虑删除整篇文章并重新编写,但我会把它留在这里供参考......有人可能会从我的错误中吸取教训。

所以最终的代码也能正确调整月份:

list($y, $m, $d)=explode('-', $r->day);
$timestamp=mktime(0,0,0,$m,$d-($day-1),$y);
$r->weekstarting = date('Y-m-d', $timestamp);

实际上这是我想要避免的,转换为时间戳,但我不能。我在这里使用的技巧是mktime()将处理负数并且正确计算时间戳。

答案 2 :(得分:1)

请创建一个测试文件并执行它:

<?php
$dates = array(
    '11 May 2011',
    '2011-04-26',
    '2011-05-04',
);

foreach($dates as $date) {
    $dt = new DateTime($date);
    $dt->modify("last monday");
    printf("For %s last monday is %s.\n", $date, $dt->format('Y-m-d'));
}
?>

它应该输出以下内容:

For 11 May 2011 last monday is 2011-05-09.
For 2011-04-26 last monday is 2011-04-25.
For 2011-05-04 last monday is 2011-05-02.

如果没有,请将您的输出添加到上面的问题中。

答案 3 :(得分:0)

我会做这样的事情:

$dow = date('N', strtotime($r->day)) - 1; // 0 will be Monday, 1 Tuesday, etc.
$start = mktime() - ($dow * 86400); // 86400 is one day in seconds
$startday = date('r', $start);