在日期中增加一天


172

我向日期添加一天的代码返回添加日期之前的日期: 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;
?>

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

Answers:


333
<?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('Ymd H:i:s',strtotime(“ $ stop_date + 1 day”));
ian

11
您不应在字符串中使用变量。您应该使用:date('Y-m-d H:i:s', strtotime($stop_date . ' + 1 day'));@ w35l3y给您的答案。
卡布隆

在运行此代码之前,应添加对date_default_timezone_set函数的调用。例如,添加date_default_timezone_set('Europe / Rome');
卡·马斯特罗斯特凡诺

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

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

6
这是最新的完美解决方案。
卡布隆

...只要在主机上运行时不会造成致命错误;)
Henrik Erlandsson 2015年

不要道歉 有人在您这样做3年后发布了贵妇人的答案
Mawg说恢复Monica

1
在运行此代码之前,应添加对date_default_timezone_set函数的调用。例如,添加date_default_timezone_set('Europe / Rome');
卡·马斯特罗斯特凡诺

@LucaMastrostefano不,您应该在服务器上设置时区...
MH

28

最简单的解决方案:

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

我喜欢用一个衬里的方式echo (new DateTime('+1 day'))->format('Y-m-d H:i:s');
Aba

@Aba我认为您的一个内衬无法在旧版本的PHP中工作,因为我尝试了该操作,但出现了一个错误:Unexpected T_OBJECT_OPERATOR” error in PHP
Zachary Weixelbaum

25

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

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

对于任何日期:

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

2
谢谢它为我工作。给出的所有解决方案中最简单的。
Puneet Verma

2
您无需重复和嵌套strtotime()-它可以在一个呼叫中处理所有事情:date('Y-m-d', strtotime($date . " +1 day"));
billynoah

2
尼斯,这是最简单的解决方案!谢谢
天使


6

易于理解的方式:

$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;

3
如果一天的长度不是24小时,则有时会因夏令时更改而失败。
Nik Dow

3

我总是只添加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时无法使用as秒,因为那天有86401秒,您如何处理leap秒?(好的,我知道它只会每隔几年发生一次,但是取决于应用程序,这可能很重要)
Glen

1
并非所有的日子都有86400秒。实际上,在美国大多数地方,每年两次减少或减少3600秒。
Peter Kovacs

1
您可以放心地忽略leap秒,因为“ Unix time”确实可以。这有些复杂,但是请阅读本文以获取更多信息:derickrethans.nl/leap_seconds_and_what_to_do_with_them.php
ChristianDavén09年

2
您应该避免这种解决方案。这是为什么:stackoverflow.com/questions/2613338/...
mspir

1
不要通过在前一天增加86400秒来添加日期!您的代码中将会有错误!这在夏令时不起作用!
sbrbot

1

虽然我同意道格·海斯(Doug Hays)的回答,但在这里我要说的是您的代码不起作用的原因是 strtotime()期望将INT作为第二个参数,而不是字符串(甚至代表日期的一个字符串)

如果您打开最大错误报告,则会看到此错误为E_NOTICE级别的“格式错误的数值”错误。


1

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

DateTime使用当前日期和时间创建一个新对象:

$due_dt = new DateTime();

获得DateTime对象后,可以通过增加或减少时间段来操纵其值:

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

您可以在PHP手册上阅读更多内容。


0

以下代码使用DateTime类及其方法Modify()和format()获取当年一月的第一天(但可以是另一个日期),并在该天增加365天(但可以是N天)。 ):

echo (new DateTime((new DateTime())->modify('first day of January this year')->format('Y-m-d')))->modify('+365 days')->format('Y-m-d');

0

既然您已经对代码的问题有一个答案,那么我可以就如何处理日期时间提出另一种观点,并专门解决您的问题。

通常,您会发现自己在解决方案方面存在问题。这只是您获得命令性代码的原因之一。如果有效,那太好了;还有其他,可以说是更具可维护性的替代方案。其中之一是声明性代码。关键是要问您需要什么,而不是如何到达那里。

在您的特定情况下,这可能如下所示。首先,你需要找出什么是你正在寻找的,那就是,探索抽象。就您而言,您似乎需要一个日期。不仅是任何日期,而且还有一些标准的表示形式。说,ISO8601日期。至少有两种实现方式:第一种是从ISO8601格式的字符串(或实际上是任何其他格式的字符串)解析的日期,第二种是在一天之后的某个将来的日期。因此,整个代码如下所示:

(new Future(
    new DateTimeParsedFromISO8601('2009-09-30 20:24:00'),
    new OneDay()
))
    ->value();

有关日期时间调整的更多示例,请查看示例。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.