在日期上增加一天

231

我编写的代码添加一天到日期后返回比添加前更早的日期: 2009-09-30 20:24:00。添加一天后的日期应该滚动到下一个月: 1970-01-01 17:33:29

<?php

    //add day to date test for month roll over

    $stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00"));

    echo 'date before day adding: '.$stop_date; 

    $stop_date = date('Y-m-d H:i:s', strtotime('+1 day', $stop_date));

    echo ' date after adding one day. SHOULD be rolled over to the next month: '.$stop_date;
?>

我以前使用过非常类似的代码,这里我做错了什么?

13个回答

417
<?php
$stop_date = '2009-09-30 20:24:00';
echo 'date before day adding: ' . $stop_date; 
$stop_date = date('Y-m-d H:i:s', strtotime($stop_date . ' +1 day'));
echo 'date after adding 1 day: ' . $stop_date;
?>

对于 PHP 5.2.0+,您也可以按照以下方式进行操作:

$stop_date = new DateTime('2009-09-30 20:24:00');
echo 'date before day adding: ' . $stop_date->format('Y-m-d H:i:s'); 
$stop_date->modify('+1 day');
echo 'date after adding 1 day: ' . $stop_date->format('Y-m-d H:i:s');

3
谢谢。将其解决为:$stop_date = date('Y-m-d H:i:s', strtotime( "$stop_date + 1 day" )); - ian
13
你不应该在字符串中使用变量。你应该像@w35l3y给你的答案一样使用:date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day')); - Cas Bloem
在运行此代码之前,您应该添加一个调用date_default_timezone_set函数的代码。 例如:添加date_default_timezone_set('Europe/Rome'); - Luca Mastrostefano
错误:在<b>/public_html/untitled5.php</b>的第<b>72</b>行,对非对象调用成员函数modify()。 - hamish
你做错了什么,@hamish - https://www.php.net/manual/en/datetime.modify.php#example-2002 - w35l3y
显示剩余2条评论

134
$date = new DateTime('2000-12-31');

$date->modify('+1 day');
echo $date->format('Y-m-d') . "\n";

8
这是一个更为完善的解决方案。 - Cas Bloem
只要在您的主机上运行时不会导致致命错误即可 ;) - Henrik Erlandsson
不要道歉。有些人在你之后三年才发布了相同的答案。 - Mawg says reinstate Monica
1
在运行此代码之前,您应该添加一个调用date_default_timezone_set函数的语句。例如,添加date_default_timezone_set('Europe/Rome'); - Luca Mastrostefano
2
@LucaMastrostefano 不,你应该在服务器上设置时区... - M H
显示剩余2条评论

91

它适用于我: 对于当前日期

$date = date('Y-m-d', strtotime("+1 day"));

对于任何日期:

date('Y-m-d', strtotime("+1 day", strtotime($date)));

2
谢谢,这对我很有效。这是最简单的解决方案。 - Puneet Verma
7
不需要重复和嵌套 strtotime() 函数,可以在一个调用中处理所有内容:date('Y-m-d', strtotime($date . " +1 day")); - But those new buttons though..
2
不错,这是最简单的解决方案!谢谢 - Angel

34

最简单的解决方案:

$date = new DateTime('+1 day');
echo $date->format('Y-m-d H:i:s');

1
我喜欢你用一行代码的方式 echo (new DateTime('+1 day'))->format('Y-m-d H:i:s'); - Aba
@Aba,我认为你的一行代码在旧版本的PHP中不起作用,因为我尝试了一下,结果出现了一个错误:“PHP中的意外T_OBJECT_OPERATOR”错误。 - Zachary Weixelbaum

9

简单易懂的方式:

$original_date = "2009-09-29";

$time_original = strtotime($original_date);
$time_add      = $time_original + (3600*24); //add seconds of one day

$new_date      = date("Y-m-d", $time_add);

echo $new_date;

5
有时在夏令时变更且白天长度不为24小时时,这个功能会失败。 - Nik Dow

7

modify() 方法可以用于向现有的 DateTime 值添加增量。

创建一个带有当前日期和时间的新的 DateTime 对象:

$due_dt = new DateTime();

一旦您拥有了DateTime对象,您可以通过添加或减去时间段来操作其值:

$due_dt->modify('+1 day');

您可以在PHP手册中阅读更多相关的IT技术内容。

7

试试这个

echo date('Y-m-d H:i:s',date(strtotime("+1 day", strtotime("2009-09-30 20:24:00"))));

谢谢,伙计。这对我很有帮助。 - Vandolph Reyes

4
我通常只是添加86400 (一天中的秒数):
$stop_date = date('Y-m-d H:i:s', strtotime("2009-09-30 20:24:00") + 86400);

echo 'date after adding 1 day: '.$stop_date; 

这可能不是最流畅的方法,但它可行!


当添加86400秒无法工作时,如何处理闰秒问题,因为那一天有86401秒?(好的,我知道这只发生在几年一次,但根据应用程序,这可能很重要) - Glen
1
并非所有的日子都有86400秒。事实上,在美国大多数地方,每年会有两次3600秒的缺失或增加。 - Peter Kovacs
2
你可以安全地忽略闰秒,因为“Unix时间”也是如此。这有点复杂,但请阅读此文章以获取更多信息:http://derickrethans.nl/leap_seconds_and_what_to_do_with_them.php - Christian Davén
2
你应该避免使用这个解决方案。原因在于:https://dev59.com/qU3Sa4cB1Zd3GeqPsRgI - mspir
1
不要通过在前一天添加86400秒来计算日期!这会导致代码出现错误!在夏令时期间,此方法无效! - sbrbot

1
虽然我同意Doug Hays的答案,但我想说你的代码无法运行的原因是strtotime()期望第二个参数是一个INT而不是一个字符串(即使它代表一个日期)。
如果你打开最大错误报告,你会看到这是一个“非格式良好的数字值”错误,这是E_NOTICE级别的。

1
<?php

function plusTimetoOldtime($Old_Time,$getFormat,$Plus_Time) {
    return date($getFormat,strtotime(date($getFormat,$Old_Time).$Plus_Time));
}

$Old_Time = strtotime("now");
$Plus_Time = '+1 day';
$getFormat = 'Y-m-d H:i:s';

echo plusTimetoOldtime($Old_Time,$getFormat,$Plus_Time);

?>

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接