PHP 显示每周两次的下一个交货日期。

问题描述 投票:1回答:1

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

下面是我目前的设置方式。

<?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');

?>

这个... 周期类 说它接受 ISO 8601时间段但据我所知,没有办法将其设置为 "下周二或周五,以较近者为准"。

我想到的一个可行的方法是运行这个函数两次,一次是周二,一次是周五,与今天的日期进行比较,然后显示未来较早的日期。 但肯定还有更优雅的方法?

php datetime dateinterval
1个回答
2
投票

这不是很难找到下一个可用的周二或周五.它是两个较小的日期。

echo min(date_create('next Tuesday'),date_create('next Friday'))->format('l, M j, Y');

或者用一个PHP扩展的DateTime API称为dt。你可以找到它 此处.

该类支持用crontab表达式计算日期。一周中的日子以0开头的周日。如果你想计算下一个周二或周五的14:00,你只需要这样做。

$cron = "0 14 * * 2,5"; //next Tuesday or Friday 14:00 
$next_delivery = dt::create('today')->nextCron($cron);  //today is 2020-05-10

echo $next_delivery->format('l, M j, Y, H:i'); 
//Tuesday, May 12, 2020, 14:00

3
投票

这是个非常冗长的方法来寻找下一个可用的周二或周五. 有一种方法是检查看看是星期几,然后根据这一点动态地设置日期。

$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';
© www.soinside.com 2019 - 2024. All rights reserved.