php - 仅在工作日获取结束日期与开始日期
问题描述
我想找到我第一次约会的结束日期。
例如我的第一次约会是
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 是星期六和星期日。
任何人都可以帮助我吗?
解决方案
您可以使用循环并检查一周中的哪一天来实现这一点。我保留了您的原始$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;
但是,这只有在保证开始日期是工作日的情况下才有效。否则,您最终会在周末结束日期。
推荐阅读
- jquery - 使用jQuery删除所有元素但保留1个带有data-id = x的元素?
- php - Sightengine API not working correctly?
- javascript - Load component dynamically insede HTML modal with Angular
- xcode - 无法验证 Mapbox.framework 中的位码
- sql - 需要澄清 SQL Server 索引选择
- python - Await Doesn't Work with Coroutine Assigned to Variable?
- salesforce - 需要 Salesforce 中当前选定的标准或自定义对象名称
- jenkins - Gitlab中用于合并请求的Jenkins管道
- reactjs - 引用redux store`dispatch`方法的方法列表?
- python - 在 OpenCV 中填充圆圈