我有一个可用的PHP date(“ N”,$ stamp)格式的工作日值和一个带有事件开始时间的时间。如果活动已经开始,我想显示下个星期的日期,如果将来是这个星期,我想显示这个星期的日期。时间范围是7天,因此,如果“现在”过去了,则预期的重复发生时间是7天。
示例
now() is tuesday, 2/10/2018, 13:00
$row['weekday'] = 2 (for tuesday)
$row['time'] = 13:01
$next should be 9/10/2018
vs。
now() is tuesday, 2/10/2018, 13:00
$row['weekday'] = 2 (for tuesday)
$row['time'] = 12:00
$next should be 2/10/2018
以下是PHP documentation的“ N”时间格式:
星期几的N ISO-8601数值表示形式(在PHP 5.1.0中添加)从1(星期一)到7(星期日)
我进行了相当多的调查,但找不到任何解决方案。我发现的唯一东西是this,它是基于以下(难看的,不起作用的)代码的。
$next = (intval(date("N", strtotime("now"))) !== intval($row['weekday']))
?
(
date("d.m.Y", strtotime(
date("Y-m-d", strtotime("now")-strtotime("+". (date("w", strtotime("now")) +0) ." day"))
)+strtotime("+".$row['weekday']." day"))
)
:
(
(
(strtotime("now"))
<
(( strtotime(
date("Y-m-d", strtotime("now")-strtotime("+". (date("w", strtotime("now")) +0) ." day"))
)+strtotime("+".$row['weekday']." day")+strtotime($row['time'])))
)
?
(date("d.m.Y", strtotime("now")))
:
(date("d.m.Y", strtotime("now +1 week")))
)
)
有什么办法解决这个问题吗?
答案 0 :(得分:0)
您应该使用\ DateTime而不是date():
$eventDate = \DateTime::createFromFormat("Y-m-d H:i:s", $date);
$today = \DateTime::createFromFormat("N", $weekDay);
$next = clone $today;
if ($today > $eventDate) {
$next->modify("+1 week"); //$next->add(new \DateInterval("P1W"))
//Eventually also set time
}
编辑:
$now = new \DateTime();
$date = \DateTime::createFromFormat("D", "Tue"); //W and N are not working
$dayPeriod = new \DateInterval("P1D");
//Check if in last week
if ($date->format("W") < $now->format("W")) {
$date->add($dayPeriod);
}
//Check if in current week
if ($date->format("W") === $now->format("W")) {
$date->add($dayPeriod);
}
echo $date->format("Y-m-d");