仅在工作日获取结束日期和开始日期

时间:2020-01-28 15:42:39

标签: php date datetime

我想找到我的第一个约会的结束日期。

例如我的第一次约会是

2020-01-01 04:20:18

我想在第一个约会之后获得20天,但只有工作日(周六和周日除外)

我创建了这个

$expirationDate = date_format(date_add(date_create(date("Y-m-d H:i:s",strtotime($_POST['created_at']))),date_interval_create_from_date_string("20 day")),'Y-m-d H:i:s');

我得到的结果是

2020-01-21 04:20:18

结束日期结果应为

2020-01-28 04:20:18

因为日期4,5,11,12,18,19,25,26是星期六和星期日。

有人可以帮助我吗?

1 个答案:

答案 0 :(得分:1)

您可以使用循环并检查要在一周的哪一天实现此目标。我保留了原始的$expirationDate计算以显示输出的差异:

$dt = date("Y-m-d H:i:s", strtotime('2020-01-01 04:20:18'));
$expirationDate = date_format(date_add(date_create($dt),date_interval_create_from_date_string("20 day")),'Y-m-d H:i:s');

// Add 20 days
for ($i = 0; $i < 20; $i++) {
    $dt = date("Y-m-d H:i:s", strtotime("+1 day", strtotime($dt)));

    // Is it a Sunday or Saturday?
    $day = date('w', strtotime($dt));
    if ($day == 0 || $day == 6)
        // Deduct one from loop counter
        $i--;
}

// Output
echo $dt;
echo $expirationDate;

输出:

$dt =             2020-01-29 04:20:18 (correct)
$expirationDate = 2020-01-21 04:20:18 (incorrect)

它如何工作?

这很简单:

  • 将开始日期存储在$dt
  • 从0到19的循环(持续20天)
  • 添加一天到$dt
  • 如果一天是星期日(0)或星期六(6),请从循环计数器($i)中减去1

替代解决方案

作为替代方案,只需将开始时间增加四个星期,即可大大简化操作:

$dt = date("Y-m-d H:i:s", strtotime('2020-01-01 04:20:18'));
$dt = date("Y-m-d H:i:s", strtotime("+4 week", strtotime($dt)));
echo $dt;

但是,只有在保证开始日期为工作日的情况下,此方法才有效。否则,您将以周末为结束日期。

相关问题