首页 > 解决方案 > PHP 显示每周两次交货的下一个交货日期

问题描述

我有一个网站,我们会在其中显示下一个交货日期,例如每周二每周交货 - 尽管有时需要手动更改交货的实际日期。我需要将其更新为(例如)周二和周五交货,我正在努力寻找一个好的方法。

这是我目前的设置方式:

<?php

$start_date = '2020-05-05';  //  Date in the past to start counting from: YYYY-MM-DD
$date_interval = new DateInterval('P7D');  //  DELIVERY EVERY x DAYS: PxD  (usually P7D)

// create a DateTime object that represents start of sequence
$start_datetime = DateTime::createFromFormat('Y-m-d', $start_date);

// create a DateTime object representing the current date
$current_datetime = new DateTime('today');

//  determine end date for DatePeriod object that will later be used.
//  This is no further out than current date plus the interval.
$end_datetime = new DateTime('tomorrow');
$end_datetime->add($date_interval);

$date_period = new DatePeriod($start_datetime, $date_interval, $end_datetime);

// iterate until the last date in the set
foreach($date_period as $dp) {
    $next_delivery = $dp;
}

echo $next_delivery->format('l, M j, Y');

?>

dateperiod表示它接受ISO 8601 时间段,但据我所知,无法将其设置为“下周二或周五,以更近者为准”。

我想到的一种可行的方法是运行此函数两​​次,一次在星期二,一次在星期五,与今天的日期进行比较,并显示未来较早的日期。但肯定有更优雅的方式吗?

标签: phpdatetimedateinterval

解决方案


要找到下一个可用的周二或周五,这是一个非常冗长的方法。一种方法是检查它是星期几,并根据它动态设置日期:

$day = (in_array((int) date('w'), [0,1,5,6], true)) ? 'Tuesday' : 'Friday';
echo (new DateTime("next {$day}"))->format('l, M j, Y');

输出:

Tuesday, May 12, 2020

上面的代码检查日期是星期日、星期一、星期五还是星期六。如果是这样,请将第二天设置为“星期二”。否则,将其设置为“星期五”。然后您可以使用相对日期时间值来设置您的日期。

如果您想要一个更易于阅读的版本,您可以拼出日期:

$day = (in_array(date('l'), ['Sunday', 'Monday', 'Friday', 'Saturday'], true)) ? 'Tuesday' : 'Friday';

推荐阅读