Php 无法在循环中添加30天截止日期

Php 无法在循环中添加30天截止日期,php,date,Php,Date,我知道还有无数其他帖子询问如何在现有日期上添加天数,但我无法让它正常工作 在这里,我试图为每个$numPayments迭代的每个日期添加30天 $numPayments = 5; $nextPaymentDate = date('m-j-Y g:i a', strtotime("+30 days")); for($i = 0; $i <= $numPayments; $i++) { echo $nextPaymentDate . "\r\r"; $nextPaymentD

我知道还有无数其他帖子询问如何在现有日期上添加天数,但我无法让它正常工作

在这里,我试图为每个$numPayments迭代的每个日期添加30天

$numPayments = 5;
$nextPaymentDate = date('m-j-Y g:i a', strtotime("+30 days"));
for($i = 0; $i <= $numPayments; $i++) {

    echo $nextPaymentDate . "\r\r";
    $nextPaymentDate = date('m-j-Y g:i a', strtotime($nextPaymentDate . " + 30 days"));              
}
$numPayments=5;
$nextPaymentDate=新日期时间;
$interval=新的日期间隔('P30D');
对于($i=0;$i添加($interval);
echo$nextPaymentDate->格式('m-j-Y g:i a')。“\r\r”;
}
这种创建初始日期和循环方式的优点是,所有内容(付款数量、添加天数和计算日期的输出格式)都是仅在代码中写入一次。如果将来需要更改其中任何一个,只需在一个位置进行更改。

$numPayments=5;
$nextPaymentDate=新日期时间;
$interval=新的日期间隔('P30D');
对于($i=0;$i添加($interval);
echo$nextPaymentDate->格式('m-j-Y g:i a')。“\r\r”;
}

这种创建初始日期和循环方式的优点是,所有内容(付款数量、添加天数和计算日期的输出格式)都是只是在代码中编写了一次。如果将来需要更改其中任何一个,只需在一个位置进行更改。

我的评论似乎已达成共识,因此我将在这里正式发布

PHP接受各种日期和时间格式,通常是最常见的格式,如图所示。美国人倾向于使用
MM/DD/YYYY
格式编写日期。在其他地方,日期通常是
DD/MM/yyyyy
格式。PHP在其他一些格式中采用了这两种格式,尽管使用了不同的分隔符。您可以使用
DD/MM/yyyyy
格式de>MM/DD/YYYY或
DD-MM-YYYY
。但是,您正在尝试使用
MM-DD-YYYY
。请更改为其他可接受的格式,您的问题应该得到解决

今天对于您的代码来说是一个奇怪的情况,它一年只发生几次,因为您将在8月9日(8/9)后添加30天,8月9日变为9月8日(9/8)。然后将其重新格式化为8月9日(9/8->8/9),这就是为什么同一日期会反复出现的原因


我同意Tomas的回答,只是因为DateTime似乎比其他独立的日期和时间方法更好。但是,他没有解决您的问题,即现有的DateTime输入格式错误,这是您问题的根源。My(未测试)猜测是,在a中使用相同的字符串将导致相同的问题。

似乎对我的评论有共识,所以我将在这里正式发布它

PHP接受各种日期和时间格式,通常是最常见的格式,如图所示。美国人倾向于使用
MM/DD/YYYY
格式编写日期。在其他地方,日期通常是
DD/MM/yyyyy
格式。PHP在其他一些格式中采用了这两种格式,尽管使用了不同的分隔符。您可以使用
DD/MM/yyyyy
格式de>MM/DD/YYYY或
DD-MM-YYYY
。但是,您正在尝试使用
MM-DD-YYYY
。请更改为其他可接受的格式,您的问题应该得到解决

今天对于您的代码来说是一个奇怪的情况,它一年只发生几次,因为您将在8月9日(8/9)后添加30天,8月9日变为9月8日(9/8)。然后将其重新格式化为8月9日(9/8->8/9),这就是为什么同一日期会反复出现的原因


我同意Tomas的回答,只是因为DateTime似乎比其他独立的日期和时间方法更好。但是,他没有解决您的问题,即现有的DateTime输入格式错误,这是您问题的根源。My(未测试)猜测是a中有相同的字符串会导致相同的问题。

删除
+
30
days
之间的空格。查看发生了什么请记住并非所有月份都包含30天。给定变量名称,我假设您要添加1个月(无论是30天、31天、28天还是29天)到开始日期。客户特别希望在付款之间间隔30天,但一般来说,您是正确的。请查看适当的日期以将日期和时间格式化为字符串。有特定的格式(欧洲和美国)必须在其中写入某些日期。我怀疑这会给今天增加30天。@TomasCreemers这不是一个解决方案,它只是为了表明blazure对格式的假设是正确的,但不管怎样,如果你在格式中添加
g:ia
,它仍然有效。它只是与OP使用的格式
m-j-Y不起作用
删除
+
30
之间的空格以及
天之间的空格。查看发生的情况记住,并非所有月份都包含30天。根据变量的名称,我假设您要添加1个月(无论是30天、31天、28天还是29天)开始日期。客户明确要求付款间隔为30天,但一般来说,您是正确的。查看合适的日期,将日期和时间设置为字符串。有特定的格式(欧洲和美国)必须在其中写入某些日期。我怀疑这会给今天增加30天。@TomasCreemers这不是一个解决方案,它只是为了表明blazure对格式的假设是正确的,但不管怎样,如果你在格式中添加
g:ia
,它仍然有效。它只是与OP使用的格式
m-j-Y不起作用
使用静态函数DateTime::createFromFormat()可以避免任何歧义以及指定所提供日期字符串的格式。在他的解释或示例中,他似乎没有“错误”格式的日期。他只生成当前时间戳“+30天”。不过,有关分隔符的有用信息会产生所有差异。您可以
09-8-2013 3:10 pm

09-8-2013 3:10 pm

09-8-2013 3:10 pm

09-8-2013 3:10 pm

09-8-2013 3:10 pm

09-8-2013 3:10 pm
$numPayments = 5;

$nextPaymentDate = new DateTime;

$interval = new DateInterval('P30D');

for ($i = 0; $i <= $numPayments; $i++) {
    $nextPaymentDate->add($interval);
    echo $nextPaymentDate->format('m-j-Y g:i a') . "\r\r";
}