php - 使用 DateInterval 和 DateTime::add 添加月份时会出现什么问题?

标签 php datetime dateinterval

我没能找到解决这个问题的合适方法。正如您在 PHP 文档中的示例 #3 中看到的那样,他们声明 one must beware when adding months在 DateTime::add 中使用 DateInterval。

对于为什么该方法的行为如此以及我可以做些什么来避免这种情况,我并没有任何解释,乍一看我发现这是一个错误。

有人对此有一些见解吗?

最佳答案

问题是每个月的天数可能不同。问题是当您想将日期增加 1 个月时您在做什么。根据 PHP 文档,如果您在 1 月 31 日(或 30 日)添加 1 个月,预期行为是什么?

2 月只有 29 天。是否要设置为该月的最后一天?如果这是您正在寻找的,或者基于当前日期的静态日期,您通常会更安全地增加一定的天数。在不知道增加月份时要完成什么的情况下,很难说出如何观察错误。

编辑:
正如有人在上面 Mike B 评论的类似帖子中提到的那样,您可能想做一些事情(在伪代码中):

 1) Use cal_days_in_month() for the next month and save that number to a variable x
 2) If x >= current billing DOB, increment and be done
 3) DateTime::modify('last day')  (havent used this before but something along these lines) to set the date to the last date of the next month (set it to the 1st of the next month, then last day?)

值得注意的是,如果您将此处的变量用作新的结算值,您将清除原始值。我会保存一个额外的 DB 值,即“第一个账单日期”或只是“billing_day_of_month”之类的东西,并用它来计算你应该查看的月中的哪一天

关于php - 使用 DateInterval 和 DateTime::add 添加月份时会出现什么问题?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9282287/

相关文章:

php - 如何在一定时间后在 PHP 中使 session 过期?

javascript - 调整图表数据?

mysql - 如何将vb.net日期保存到mysql日期而不带0000-00-00

php - 在 cURL 中发送发布请求以获取 cookie 适用于一个虚拟主机,但不适用于另一个

php - MySQL -> 选择第二低的值

sql - CAST nvarchar 到 DATETIME

objective-c - NSDateFormatter 生产(空)SQLite 和 iOS 5.1

date - 在 Twig 中显示日期间隔

PHP Mysql 从一天中的两个日期时间计算每天的总飞行小时数

php - PHP DateInterval 是否与 DateTime 具有可比性?