如果给出PHP“ N”日期值,则查找每周事件的下一次重复

时间:2018-10-02 11:25:14

标签: php time

我有一个可用的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")))
                  )

              )

有什么办法解决这个问题吗?

1 个答案:

答案 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");