昨天我遇到了PHP的strtotime问题没有正确添加一个月。在'2011-05-31'我跑了:
date('Y-m-d',strtotime( '+1 month', strtotime('now')));
当我期待'2011-06-30'时,返回'2011-07-01'。
MySQL没有任何问题。
我宁愿不用这个重新发明轮子,因为根据我的经验,通过日期计算很容易犯错误。
有没有人为PHP 5.1提供可靠且经过测试的解决方案?
答案 0 :(得分:5)
在PHP中当然可以:检查strtotime manual, especially this comment。
如果你有一个可用的MySQL连接,SELECT DATE_ADD( '2011-05-31', INTERVAL 1 MONTH )
可以减少冗余,因为(正确的)功能已经实现,你不必自己实现它。
答案 1 :(得分:2)
由于这似乎是一个相当令人困惑的话题,因此这里有一些信息:
你实际上得到了一个准确的结果,它实际上将月份增加了1,当天仍然是31,因此日期是2011-06-31。如果您执行echo date('Y-m-d', strtotime('2011-06-31'));
,则会看到它显示2011-07-01
。
function next_month($timestamp)
{
$next_month = date('m', $timestamp);
$next_month++;
$next_year = date('Y', $timestamp);
if($next_month == 12)
{
$next_year++;
}
if(date('d', $timestamp) <= date('t', mktime(0, 0, 0, $next_month, 1, $next_year)))
{
return date('Y-m-d',strtotime( '+1 month', $timestamp));
}
else
{
return date('Y-m-d', mktime(0, 0, 0, $next_month, date('t', mktime(0, 0, 0, $next_month, 1, $next_year)), $next_year));
}
}
echo next_month(strtotime('2011-05-31'));
echo next_month(strtotime('2011-05-01'));
这是我刚才写的库中的修改代码 - 我从来没有找到一个优雅的解决方案。
有关此主题的详细问答,请参阅PHP DateTime::modify adding and subtracting months。
答案 2 :(得分:1)
你可能会说PHP正在做正确的事情,MySQL是错误的:
MySQL正在将值缩减回适合年/月定义的最后一个有效日期。 PHP向上调整,向前移动到与指定日期匹配的第一个正确日期(31-30 =过去1天,因此2011-06-30 + 1天= 2011-07-01)。
答案 3 :(得分:1)
添加+2592000 seconds
( 60×60×24×30 )对我来说是理想的方式。
答案 4 :(得分:1)
您可以将strtotime( 'last day of +1 month', strtotime('now'))
的结果与strtotime( '+1 month', strtotime('now'))
进行比较,并使用较早的结果。
答案 5 :(得分:1)
尝试使用:
$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
答案 6 :(得分:0)
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
这将解决您的问题。