如何使用PHP获取昨天的日期?

137

我想在PHP中使用特定日期格式获取昨天的日期,这是格式:

$today = date("d.m.Y"); //15.04.2013

有可能吗?

如果需要更改,考虑相应的月份和年份。


1
date("d.m.y", time() - 60 * 60 * 24); - AllTooSir
你试过我的解决方案吗?这个方法也适用于更改月份。 - Fabio
当上面的用户名“noob”添加了良好的意义到它的评论时,这是完美的时刻 :) - STT LCU
12个回答

363

你做得很好

date('d.m.Y',strtotime("-1 days"));

如果月份变化,这也将起作用。


一个小问题:如果时间跨越了夏令时的更改,您的函数在午夜附近会遇到麻烦。明确地经过中午可以解决这个问题。 - Deduplicator
3
错误。关于夏令时的3个事实:1.它依赖于服务器时间,如果服务器具有正确的时区,则不会影响我的功能。2.并非全世界都受夏令时的影响,某些地方不使用它。3.大多数地方在一天的前几个小时(如凌晨2或3点)更改时间,所以不会影响一个变化中的日子。 - Fabio
1
  1. 这样函数就知道并注意到一天可能不止24小时了吗?
  2. 即使是坏掉的时钟,每天也会准确两次。
  3. 被盗/复制的确切时间对计算并不那么重要。
- Deduplicator
2
1天不过是24小时,直到夏令时改变时间和服务器相应更改时间。 2当然是,但这不是重点。 3这非常重要,如果时间在午夜更改而不是其他时间,您的想法可能是正确的。 - Fabio

27

昨天的日期在PHP中:

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

1
对我来说最容易理解的方式。 - zsalya

14

试一试

        $tz    = new DateTimeZone('Your Time Zone');
        $date  = new DateTime($today,$tz);
        $interval = new DateInterval('P1D');
        $date->sub($interval); 

        echo $date->format('d.m.y');

        ?>           

请查看此链接:http://php.net/manual/zh/book.datetime.php。这也适用于月份的更改。 - alwaysLearn
12
new DateTime('yesterday') 可以翻译为“昨天的日期时间”。 - Virgili Garcia
1
$yesterday = new DateTime('昨天', new DateTimeZone('你的时区')); - miralong
这段代码只有回答,稍微解释一下会更好。 - mickmackusa

14

如果您在PHP应用程序中定义了时区(正如您应该这样做的那样),您可以通过以下方式来实现:

date_default_timezone_set('Europe/Paris');

然后就很简单:

$yesterday = new DateTime('yesterday'); // will use our default timezone, Paris
echo $yesterday->format('Y-m-d'); // or whatever format you want

(您可能希望定义一个常量或环境变量来存储您的默认时区。)


11

你可以通过这样做来实现

date("F j, Y", time() - 60 * 60 * 24);

或者通过

date("F j, Y", strtotime("yesterday"));

3
使用夏令时不能保证准确性……如今的做法应该是使用 DateTime 对象。 - Mark Baker
如果在协调世界时上运行,则可以正常工作。date_default_timezone_set('UTC'); - Patrick

8

步骤1

我们需要在函数date()中设置格式化的数据:

函数date()返回一个字符串,该字符串根据给定的格式字符串使用给定的整数时间戳或当前时间(如果未给出时间戳)进行格式化。换句话说,时间戳是可选的,默认为time()的值。

<?php
echo date("F j, Y");
?>

结果: 2010年3月30日

步骤2

对于“昨天”的日期,使用php函数mktime(): 函数mktime()返回与给定参数对应的Unix时间戳。该时间戳是一个长整数,包含自Unix纪元(1970年1月1日00:00:00 GMT)以来所经过的秒数和指定的时间。 参数可以从右到左省略;因此省略的任何参数将根据当地日期和时间设置为当前值。

<?php
echo mktime(0, 0, 0, date("m"), date("d")-1, date("Y"));
?>

结果:1269820800

步骤三

现在合并所有内容并查看:

<?php
$yesterday = date("Y-m-d", mktime(0, 0, 0, date("m") , date("d")-1,date("Y")));
echo $yesterday;
?>

结果:2010年3月29日

类似地操作,可以收到时间小时回来。

<?php
$yesterday = date("H:i:s",mktime(date("H"), 0, 0, date("m"),date("d"), date("Y")));
echo $yesterday;
?>

结果:20:00:00

或者是7天前:

<?php
$week = date("Y-m-d",mktime(0, 0, 0, date("m"), date("d")-7,date("Y")));
echo $week;
?>

结果:2010年3月23日


4

针对DateTime的另一种面向对象的方法,可以设置精确的小时数:

$yesterday = new DateTime("yesterday 09:00:59", new DateTimeZone('Europe/London'));
echo $yesterday->format('Y-m-d H:i:s') . "\n";

2

试一下

<?php
$yesterday = date(“d.m.Y”, time()-86400);
echo $yesterday;

3
由于夏令时的存在,一天的长度不总是等于86400秒!因此这个计算结果每年可能有两次错误! - sbrbot
...由于闰秒的原因。 - Sebastian Mach

2

大多数答案都是过程/混合风格的。这里是纯OOP风格的解决方案:

$today = new DateTime();
$yesterday = $today->sub(new DateInterval("P1D"));
echo $yesterday->format("d.m.Y");

它还可以解决夏令时和时区问题。简单易行。


0

创建一个函数并使用'Carbon API'

function getYesterday()
{
    return \Carbon\Carbon::yesterday()->format('Y-m-d');
}

调用函数

getYesterday();

1
这是正确的,但只有在使用“Carbon API”时才有效。对于这种情况,PHP本身也有一种简单的方法。 - Zargaripour

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