首页 > 解决方案 > 仅在工作日获取结束日期与开始日期

问题描述

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

例如我的第一次约会是

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 是星期六和星期日。

任何人都可以帮助我吗?

标签: phpdatedatetime

解决方案


您可以使用循环并检查一周中的哪一天来实现这一点。我保留了您的原始$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;

但是,这只有在保证开始日期是工作日的情况下才有效。否则,您最终会在周末结束日期。


推荐阅读