我想找到我的第一个约会的结束日期。
例如我的第一次约会是
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是星期六和星期日。
有人可以帮助我吗?
答案 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
$dt
$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;
但是,只有在保证开始日期为工作日的情况下,此方法才有效。否则,您将以周末为结束日期。