【发布时间】:2009-02-02 08:24:30
【问题描述】:
我认为这是可能的,但我想不出合适的算法。
我想做的是:
如果今天是 2009 年 2 月 2 日星期一,我怎么知道上周星期二的日期?两天后使用相同的代码,我会找到上周星期二的相同日期,当前日期是 2009 年 2 月 4 日星期三。
【问题讨论】:
我认为这是可能的,但我想不出合适的算法。
我想做的是:
如果今天是 2009 年 2 月 2 日星期一,我怎么知道上周星期二的日期?两天后使用相同的代码,我会找到上周星期二的相同日期,当前日期是 2009 年 2 月 4 日星期三。
【问题讨论】:
这些答案中的大多数要么太多,要么在技术上不正确,因为“上周二”并不一定表示上周的周二,而只是表示上周二,可能在“现在”的同一周内。
正确答案是:
strtotime('tuesday last week')
【讨论】:
我知道已经有一个可接受的答案,但恕我直言,它不符合要求的第二个要求。在上述情况下,如果在星期三使用 strtotime 将在昨天产生。所以,确切地说,你仍然需要检查这个:
$tuesday = strtotime('last Tuesday');
// check if we need to go back in time one more week
$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400 : $tuesday;
正如 davil 在他的评论中指出的那样,这是我的快速拍摄。由于夏令时,上述计算每年将减少一次。足够好的解决方案是:
$tuesday = date('W', $tuesday)==date('W') ? $tuesday-7*86400+7200 : $tuesday;
如果你需要时间是 0:00h,当然你需要一些额外的努力。
【讨论】:
【讨论】:
工作解决方案:
$z = date("Y-m-d", strtotime("last Saturday"));
$z = (date('W', strtotime($z)) == date('W')) ? (strtotime($z)-7*86400+7200) : strtotime($z);
print date("Y-m-d", $z);
【讨论】:
你忘记了日期第二个参数的 strtotime('W', $tuesday) 嗯。
将 $tuesday 转换为 "$tuesday-7*86400+7200" 之前的时间戳
mde.
【讨论】:
// test: find last date for each day of the week
foreach (array('Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat', 'Sun') as $day) {
print $day . " => " . date('m/d/Y', last_dayofweek($day)) . "\n";
}
function last_dayofweek($day)
{
// return timestamp of last Monday...Friday
// will return today if today is the requested weekday
$day = strtolower(substr($day, 0, 3));
if (strtolower(date('D')) == $day)
return strtotime("today");
else
return strtotime("last {$day}");
}
【讨论】:
<?php
$currentDay = date('D');
echo "Today-".$today = date("Y-m-d");
echo "Yesterday-".$yesterday = date("Y-m-d",strtotime('yesterday'));
echo "Same day last week-".$same_day_last_week = date("Y-m-d",strtotime('last '.$currentDay));
?>
【讨论】:
不要使用手动计算,而是使用 DateTime 对象。它有适当的实施,考虑到闰年、耶普秒等。
$today = new \DateTime();
$today->modify('tuesday last week');
modify 方法修改相对于它的状态的日期,所以如果你将日期设置为不同的日期,它会相对于它计算它。
$date = new \DateTime('2020-01-01');
echo $date->format('Y-m-d'); // 2020-01-01
$date->modify('tuesday last week');
echo $date->format('Y-m-d'); // 2019-12-24
【讨论】: