【问题标题】:PHP: Next delivery date [closed]PHP:下一个交货日期[关闭]
【发布时间】:2015-10-11 12:02:05
【问题描述】:

PHP 新手,所以请原谅问题的简单性。

我正在尝试创建一个小回显,根据两个参数显示“下一个交货日期”:开始日期和间隔(以天或周为单位)。

我特别想要的是能够输入例如今天作为“开始日期”和间隔(例如“3 周”),并让脚本返回“您的下一次交货时间为 XXX” ,其中 XXX 是未来即将到来的下一个 3 周间隔,直到并包括两天前,当它切换到“明天”时。在实际日期,它移动到下一个时期(不能在交货日期订购交货)到无限期或未来的某个现实日期(未来 5 年?)

这可能吗?我已经查看了以前的问题,添加一个锁定日期(一个日期+未来一段时间)似乎相当微不足道,但我没有遇到任何查看当前日期并考虑下一个复发将是......因此我在这里问。

【问题讨论】:

  • 不清楚您如何指定可用的交货日期。
  • @MikeBrant 没关系 - 它可以是字符串,可以从 html5 日期输入或某种 JS 中选择。可以很简单echo stftime('%Y-%m-%d %H:%M:%S', strtotime('+3 weeks')); 现在的问题是作者想要达到什么样的目标。
  • 嗯。再问你的问题。我一直陪着你,直到“你的下一个交货时间是 XXX”。从那时起,就不清楚你在寻找什么......
  • 我同意@zipkit 的观点,直到同一点。在那一点上,您似乎推断出有一些特定的日期可以交付。如果没有,而您只想根据一些输入来预测日期,那么使用 DateTimeDateIntervalDatePeriod 类非常简单。
  • 对不起...我知道我会添加更多的雾而不是清晰度。如果我的开始日期为 2015 年 7 月 21 日,并且每 3 周的交货期持续进行,我如何显示下一个且仅显示下一个即将到来的交货日期?

标签: php date datetime intervals


【解决方案1】:

您可以为此使用DatePeriodDatePeriodDateTime 对象作为第一个参数的开始日期,DateInterval 对象作为重复的间隔,对于第二个参数,DateTime 对象或整数表示结束日期或该期间的重复次数。

因此,例如,如果您的开始日期为今天,间隔 3 周,您可以通过类似这样的方式获得交货日期...

$start    = new DateTime('today');
$interval = new DateInterval('P3W');
$period   = new DatePeriod($start, $interval, 1, DatePeriod::EXCLUDE_START_DATE);

foreach($period as $deliveryDate) {
    echo "Next delivery date: " . $deliveryDate->format('Y-m-d');
}

这应该会给你类似...

Next delivery date: 2015-08-11

【讨论】:

  • DatePeriod() 方式很酷的功能。该函数本质上创建了一个方便的数组,其中包含间隔时间段内的所有日期。感谢分享。我不确定这正是@Snip 所要求的,但我可以看到将来我可能会在哪里使用它。
  • echo "Next delivery date: " . $deliveryDate->format('Y-m-d');} 行添加了一个右括号,看起来就像一个魅力!
  • 您的意思是在下一行存在的右括号顶部?
【解决方案2】:

您强烈考虑为此使用 DateTime、DateInterval、DatePeriod 类。可能看起来像这样:

$start_date = '2015-07-21'; // or whatever date you get from some location
// 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');    
$date_interval = new DateInterval('P3W'); // for 3 weeks
// 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('today');
$end_datetime->add($date_interval);

$date_period = new DatePeriod($start_datetime, $interval, $end_datetime, DatePeriod::EXCLUDE_START_DATE);

// at this point, you simply need to grab last item from $date_period to get next delivery
// unfortunately there is no array access on this object, so you just need to iterate until the end
foreach($date_period as $dp) {
    $next_delivery = $dp;
}

// echo date from next delivery
echo $next_delivery->format('Y-m-d');

【讨论】:

  • 这行好像报错了:$date_period = new DatePeriod($start_datetime, $interval, $end_datetime, DatePeriod::EXCLUDE_START_DATE);
  • 这是错误信息:Fatal error: Uncaught exception 'Exception' with message 'DatePeriod::__construct(): This constructor accepts either (DateTime, DateInterval, int) OR (DateTime, DateInterval, DateTime) OR (string) as arguments.' in /home/johnglh1/public_html/Date-increment.php:19 Stack trace: #0 /home/johnglh1/public_html/Date-increment.php(19): DatePeriod->__construct(Object(DateTime), NULL, Object(DateTime), 1) #1 {main} thrown in /home/johnglh1/public_html/Date-increment.php on line 19
  • @Snip 似乎 DateInterval 对象由于某种原因在您的设置中没有被实例化。您必须使用 PHP 5.2。 DateInterval 是在 5.3 中引入的
  • 抱歉回复慢:假期。更多数据:PHP 版本 5.4.28...所以我猜不是吗?
猜你喜欢
  • 2020-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-02-05
  • 1970-01-01
  • 2022-10-31
  • 2016-08-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多