上周一 - 周日的日期:有更好的方法吗?

时间:2010-03-09 21:09:25

标签: php mysql datetime

我正准备查询mySQL以获取前一周的记录,但我必须将周数视为周一至周日。我最初这样做了:

WHERE YEARWEEK(contactDate) = YEARWEEK(DATE_SUB(CURDATE(),INTERVAL 7 DAY))

发现mySQL将周视为周日 - 周一。所以相反,我正在解析开始&像这样在PHP结束日期:

$i = 0; 
while(date('D',mktime(0,0,0,date('m'), date('d')-$i, date('y'))) != "Mon") { 
  $i++; 
}

$start_date = date('Y-n-j', mktime(0,0,0,date('m'), date('d')-($i+7), date('y')));
$end_date  = date('Y-n-j', mktime(0,0,0,date('m'), date('d')-($i+1), date('y')));

这有效 - 它获取当周的星期一(向后走,直到星期一被击中),然后根据该日期计算前一周的日期。

我的问题是:有更好的方法吗?看起来很草率,我希望那里有人可以给我一个更干净的方法 - 或许不是因为我需要周一 - 周日周。

修改

显然,有:

$start = date('Y-m-d',strtotime('last monday -7 days'));
$end   = date('Y-m-d',strtotime('last monday -1 days'));

这大约是可读性的一百万倍。谢谢。

5 个答案:

答案 0 :(得分:29)

您可以使用strtotime来处理此类日期问题

echo strtotime("last Monday");

答案 1 :(得分:9)

(在marvin和Stomped上补充)你也可以这样使用

echo date('Y-m-d',strtotime('-1 Monday')); //last Monday
echo date('Y-m-d',strtotime('-2 Monday')); //two Mondays ago
echo date('Y-m-d',strtotime('+1 Monday')); //next Monday

答案 2 :(得分:3)

strtotime("previous week Monday")

前一周的星期一。

答案 3 :(得分:2)

Marvin的回答非常优雅,虽然如果你真的想要表现,你可以用一点算术来做。您可以派生一个公式/方法将任意日期转换为“从某个起点开始的天数”(可能是01.01.0000),然后其余的操作将很容易。从这样的数字中获取星期几就像减去和得到除法的其余部分一样简单。

实际上,PHP在其PEAR库中有一个Date类,它正是这样做的。

答案 4 :(得分:1)

我必须向所有读者指出,马文的回答存在一个大问题

这是捕获 “最后一个星期一”功能将返回“最新”星期一的日期。如果今天是星期一,将会这样解释,那么它将在星期一返回“上周”的日期,但是如果今天不是星期一,它将返回星期一“这个星期” 该课题要求周一返回“上周”。因此,如果今天不是星期一,结果将是不正确的。 我已经解决了这个问题并且包含在我的Date Time Helper中 在“包含”类

之后,它只会是一行

$ lastWeekMonday = Model_DTHpr :: getLastWeekMonday();

点击这里

https://github.com/normandqq/Date-Time-Helper