获取上周一 - 周日的日期:有更好的方法吗?
Posted
技术标签:
【中文标题】获取上周一 - 周日的日期:有更好的方法吗?【英文标题】:Get Last Monday - Sunday's dates: Is there a better way? 【发布时间】:2011-01-25 15:16:16 【问题描述】:我正在为 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'));
这大约是可读性的一百万倍。谢谢。
【问题讨论】:
【参考方案1】:您可以使用strtotime 处理此类日期问题
echo strtotime("last Monday");
【讨论】:
优雅!我忘了这件事。echo date('Y-m-d',strtotime('last monday -7 days'));
令人难以置信。
令人难以置信的是对的!惊人的! strftime('%Y-%m-%d', strtotime("上周星期一")) 或者试试: strftime('%Y-%m-%d', strtotime("上个月的第一天"));
@marvin 你是等到今天才测试它吗? ;-)
它应该是“上周一”,上周一将返回本周周一。【参考方案2】:
(对 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
【讨论】:
【参考方案3】:strtotime("previous week Monday")
前一周的星期一。
【讨论】:
正是我一直在寻找的...#awesome 这是更正确的答案,而不是“-1 Monday”和“Last Monday”,它们返回本周的星期一【参考方案4】:Marvin 的回答非常优雅,尽管如果您真的想追求性能,您可以通过一点算术来做到这一点。您可以推导出一个公式/方法来将任意日期转换为“从某个起点开始的天数”(可能是 01.01.0000),然后其余的操作就很容易了。从这样的数字中获取星期几就像减去并得到除法的余数一样简单。
实际上,PHP 在其 PEAR 库中有一个 Date 类,正是这样做的。
【讨论】:
【参考方案5】:我必须在这里向所有读者指出,马文的回答有一个大问题
这是关键 "last Monday" 函数会返回 "latest" Monday 的日期。这样解释,如果今天是星期一,则返回 "LAST WEEK" 星期一的日期,但如果今天不是星期一,则返回“本周”星期一 问题是要求周一返回“上周”。因此,如果今天不是星期一,结果将不正确。 我已经解决了这个问题并包含在我的日期时间助手中 在您“包含”课程后,它将只有一行
$lastWeekMonday = Model_DTHpr::getLastWeekMonday();
检查这里
https://github.com/normandqq/Date-Time-Helper
【讨论】:
我也发现了。但是,就我而言,即使我在周二运行它,我也想确保我在上周一确实得到了它。我发现你可以这样做:strftime('%Y-%m-%d', strtotime("last week Monday"))以上是关于获取上周一 - 周日的日期:有更好的方法吗?的主要内容,如果未能解决你的问题,请参考以下文章