使用PHP获取前一天和后一天

84

我设置了两个箭头,一个是“下一天”、“下两天”、“即将到来”,另一个是“前一天”、“前两天”、“过去”,但代码似乎不起作用,因为只能获得一个“下一天”和“前一天”。

<a href="home.php?date=<?= date('Y-m-d', strtotime('-1 day', strtotime($date))) ?>" class="prev_day" title="Previous Day" ></a> 
<a href="home.php?date=<?= date('Y-m-d', strtotime('+1 day', strtotime($date))) ?>" class="next_day" title="Next Day" ></a>

是否有一种方法,使得当我点击下一个按钮时,日期会连续改变到下一天。暂时只增加一天。


1
你期望得到什么?你的问题不够清晰。 - Nick
1
你的代码创建了一个链接用于下一天和一个链接用于前一天。你有什么问题? - Gordon
@Alan Nope:int strtotime ( string $time [, int $now ] ) 请参阅 http://de2.php.net/manual/en/function.strtotime.php。 - Gordon
@GordonгҖӮжҠұжӯүпјҢжҲ‘дёҖзӣҙдҪҝз”ЁдёҖдёӘеҸӮж•°strtotime('2011-05-03 -1 day')гҖӮжҜҸеӨ©йғҪжҳҜеӯҰж Ўзҡ„дёҖеӨ©пјҒ - Alan Whitelaw
还有一种现代而优美的方式呢?:(new DateTime('now+1day'))->format('Y-m-d') 这就是明天的日期 :) 你也可以猜测一下如何获得昨天的日期... :) - jave.web
显示剩余7条评论
12个回答

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

应该阅读

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

更新答案以回答评论中关于日期不断更改的问题。

<?php
$date = isset($_GET['date']) ? $_GET['date'] : date('Y-m-d');
$prev_date = date('Y-m-d', strtotime($date .' -1 day'));
$next_date = date('Y-m-d', strtotime($date .' +1 day'));
?>

<a href="?date=<?=$prev_date;?>">Previous</a>
<a href="?date=<?=$next_date;?>">Next</a>

这将从当前日期增加或减少一天。


1
谢谢。如果我点击下一个按钮,日期会连续改变到下一天,你知道我的意思吗?暂时只会向前推进一天。 - tonoslfx
$date=date('Y-m-d'); echo date($date,strtotime('-1 days'));其不会给出前一天的日期,而是显示当前日期。如何解决这个问题? - user2552725
1
date('Y-m-d', strtotime('+1 day', strtotime($date))) 是可以的。这样你就可以输入你要计算的日期,而不是当前日期。 - Keith Grey

8

只需使用这个

echo date('Y-m-d',strtotime("yesterday"));
echo date('Y-m-d',strtotime("tomorrow"));

7

需求: PHP 5 >= 5.2.0

您应该在Php中使用DateTimeDateInterval类,这将使事情变得非常简单和可读。

示例:让我们获取前一天。

// always make sure to have set your default timezone
date_default_timezone_set('Europe/Berlin');

// create DateTime instance, holding the current datetime
$datetime = new DateTime();

// create one day interval
$interval = new DateInterval('P1D');

// modify the DateTime instance
$datetime->sub($interval);

// display the result, or print_r($datetime); for more insight 
echo $datetime->format('Y-m-d');


/** 
* TIP:
* if you dont want to change the default timezone, use
* use the DateTimeZone class instead.
*
* $myTimezone = new DateTimeZone('Europe/Berlin');
* $datetime->setTimezone($myTimezone); 
*
* or just include it inside the constructor 
* in this form new DateTime("now",   $myTimezone);
*/

参考资料:《现代 PHP,新功能和良好实践》Josh Lockhart著


3
DateInterval并不是为此目的而设计的 :) ,您可以使用(new DateTime('now+1day'))->format('Y-m-d')来实现。 - jave.web

6

使用

$time = time();

对于前一天 -

date("Y-m-d", mktime(0,0,0,date("n", $time),date("j",$time)- 1 ,date("Y", $time)));

两天前。
date("Y-m-d", mktime(0,0,0,date("n", $time),date("j",$time) -2 ,date("Y", $time)));

明天的计划 -

date("Y-m-d", mktime(0,0,0,date("n", $time),date("j",$time)+ 1 ,date("Y", $time)));

接下来的两天

date("Y-m-d", mktime(0,0,0,date("n", $time),date("j",$time) +2 ,date("Y", $time)));

1
你确定这在边缘情况下也能正常工作吗?例如,如果当前日期是31号,当你尝试获取+1时会发生什么? - Pavel Nikolov
@PavelNikolov 请查看mktime()示例#2。像“32”这样的“错误输入”是允许的。 - mgutt

4

只需要这样称呼它:

<a href="home.php?date=<?= date('Y-m-d', strtotime('-1 day')) ?>" class="prev_day" title="Previous Day" ></a>
<a href="home.php?date=<?= date('Y-m-d', strtotime('+1 day')) ?>" class="next_day" title="Next Day" ></a>

同时请参阅文档


3
strtotime('-1 day', strtotime($date))

该函数返回给定日期与$date之间的秒差异。因此,您得到了错误的结果。

假设$date是今天的日期,-1天意味着它返回-86400作为差异,当您尝试使用date时,您将获得1969-12-31 Unix时间戳开始日期。


3
您可以使用字符串'now'来获取今天/明天/昨天的日期:
$previousDay = date('Y-m-d', strtotime('now - 1day'));
$toDay       = date('Y-m-d', strtotime('now'));
$nextDay     = date('Y-m-d', strtotime('now + 1day'));

'now' !== 'today'. You could use $previousDay = date('Y-m-d', strtotime('today - 1 day')); - Елин Й.

1

始终确保设置了默认时区

date_default_timezone_set('Europe/Berlin');

创建一个DateTime实例,保存当前日期和时间。
$datetime = new DateTime();

创建一天的时间间隔。
$interval = new DateInterval('P1D');

修改 DateTime 实例。
$datetime->sub($interval);

显示结果,或者使用print_r($datetime);以获得更深入的了解。
echo $datetime->format('Y-m-d');

提示:

如果您不想更改默认时区,请使用DateTimeZone类。

$myTimezone = new DateTimeZone('Europe/Berlin');
$datetime->setTimezone($myTimezone); 

或者将它包含在构造函数中,形式如下:new DateTime("now", $myTimezone);


0

如果您需要获取今天日期的前一天或后一天

date("Y-m-d", mktime(0, 0, 0, date("m"),date("d")-1,date("Y")));

只需将“-1”更改为“+1” 祝好,Yosafat


0

使用dateTime()对象也非常简单。

$tomorrow = new DateTime('tomorrow');
echo $tomorrow->format("Y-m-d"); // Tomorrow's date

$yesterday = new DateTime('yesterday');
echo $yesterday->format("Y-m-d"); // Yesterday's date

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