我需要找到一种方法来获取基于另一天的星期一的日期。所以例如,如果星期三是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 = ;
}
}
答案 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);