在PHP5.1中添加月份的准确方法?
昨天我遇到了一个问题,PHP的strotime没有正确地添加一个月。2011年5月31日,我跑了:在PHP5.1中添加月份的准确方法?,php,strtotime,Php,Strtotime,昨天我遇到了一个问题,PHP的strotime没有正确地添加一个月。2011年5月31日,我跑了: date('Y-m-d',strtotime( '+1 month', strtotime('now'))); 当我期待“2011-06-30”时,返回“2011-07-01” MySQL这样做没有任何问题 我不想用这个来重新发明轮子,因为根据我的经验,日期计算很容易出错 是否有人为PHP5.1提供了可靠且经过测试的解决方案?在PHP中,这当然是可能的:请检查 如果您有可用的MySQL连接,SE
date('Y-m-d',strtotime( '+1 month', strtotime('now')));
当我期待“2011-06-30”时,返回“2011-07-01”
MySQL这样做没有任何问题
我不想用这个来重新发明轮子,因为根据我的经验,日期计算很容易出错
是否有人为PHP5.1提供了可靠且经过测试的解决方案?在PHP中,这当然是可能的:请检查
如果您有可用的MySQL连接,
SELECT DATE\u ADD('2011-05-31',INTERVAL 1 MONTH)
将减少冗余,因为(正确的)功能已经实现,而您无需自己实现。您可能认为PHP做的是正确的,而MySQL做的是错误的:
MySQL将该值限制在符合年/月定义的最后一个有效日期。PHP向上调整,向前移动到与指定日期匹配的第一个适当日期(31-30=过去一天,因此2011-06-30+1天=2011-07-01)。添加
+2592000秒(60×60×24×30)对我来说是理想的方式。你可以比较strotime('1个月的最后一天',strotime('now')的结果
使用strotime(“+1个月”,strotime('now'))
,并使用较早的一个。由于这似乎是一个相当令人困惑的主题,以下是有关它的一些信息:
你实际上得到了一个准确的结果,它实际上是增加了1个月,日期仍然是31,因此日期是2011-06-31。如果你做了echo日期('Y-m-d',strottime('2011-06-31')代码>您将看到它显示2011-07-01
这里有一种方法可以使这项工作在PHP5.1(及之前版本)中达到“预期”效果
下个月的函数($timestamp)
{
$next_month=日期('m',$timestamp);
$next_month++;
$next_year=日期('Y',$timestamp);
如果($next_month==12)
{
$next_year++;
}
if(日期('d',$timestamp)
这将解决您的问题。尝试使用:
$date = date_create("1900-01-01"); // Your start date
$new_date = date_add($date, date_interval_create_from_date_string('1 month')); // Your end date
你设置了正确的区域设置了吗?如果你想在PHP中获得更好的覆盖率,那么这个课程将是值得冒险的。这个问题的答案看起来应该可以解决你的问题:这是100%正确的,它增加了1个月,但6月只有30天,因此第31天是8月1日。在我问了一段时间的问题中,简洁的回答返回:DateTime对象是PHP5.2,我特别要求提供PHP5.1解决方案。我的区域设置为正确的时区。谢谢,我从不知道这是可用的。很高兴我回答了这个问题。如果我必须选择MySQl、Sql Server、Javascript等与PHP的哪一方是正确的,在这种情况下我不会选择PHP。2月呢?1月31日st+30天让你进入3月,完全跳过2月。这有一个类似的问题,但增加了30天而不是31天
For other Months : date('Y-m-t',strtotime("2015-05-31T23:59:59 -3 days +1 month"));
Output : 2015-06-30
For Feb : date('Y-m-t',strtotime("2015-01-31T23:59:59 -3 days +1 month"));
Output : 2015-02-28
$date = date_create("1900-01-01"); // Your start date
$new_date = date_add($date, date_interval_create_from_date_string('1 month')); // Your end date