【问题标题】:PHP How to find the date and time one year and one day ago when it's a leap yearPHP如何在闰年时找到一年零一天前的日期和时间
【发布时间】:2012-08-31 13:55:34
【问题描述】:

我试图让 php 计算一年零一天前的日期。我有这个:

$date = date(strtotime('-366 days'));
$oneyear_oneday = date("Y-m-d H:i:s", $date); 

$date = date(strtotime('-1 year'));
$oneyear = date("Y-m-d H:i:s", $date);

但是,由于是闰年,$oneyear 和 $oneyear_oneday 提供相同的输出。有谁知道我如何正确计算?

如果是 2012 年 8 月 15 日下午 3 点,我希望输出是 2011 年 8 月 15 日下午 3 点

【问题讨论】:

  • $oneyear 有什么问题?似乎给出了正确的输出...?
  • 您的 date(strtotime()) 调用不正确。 date() 的第一个参数是一个格式字符串,您传入的是原始时间值。 strtotime 已经返回了一个时间戳,因此在您准备好将其转换为字符串之前,无需对其进行“日期化”。

标签: php date


【解决方案1】:

使用 PHP5.3,

   $date = new DateTime();
   $interval = new DateInterval("P1Y");
   $newdate = $date->sub($interval);

【讨论】:

  • 大家,请像这个例子一样使用较新的 DateTime 类,而不是旧的非 OO date() 函数。
  • 虽然我同意使用较新的 DateTime,但我也认为旧的非 OO date() 函数适用于简单的东西。
  • @J.Bruni:我喜欢 DateTime/Interval/Period/Zone 类,因为它们会处理边缘情况。我不必担心闰年或夏令时或时区会影响我的计算。虽然旧功能仍然有效,但即使在简单情况下我也倾向于不使用它们,因为谁知道什么时候会弹出边缘情况并让你措手不及。
  • 我认为可能是因为使用 PHP 这么久,并且遇到了所有这些棘手的边缘情况(间隔、跳跃、DST、区域等),我对旧功能有了经验并感到满意,虽然我对新产品没有这些经验。
  • @dnagirl:谢谢你,但我目前使用的是 PHP 版本 5.2.17,所以我将接受下面 J. Bruni 的回答。
【解决方案2】:

首先,减去一年。然后,从结果中减去一天:

$date = strtotime('-1 day', strtotime('-1 year'));
$oneyear_oneday = date("Y-m-d H:i:s", $date); 

【讨论】:

  • 如此简单!我知道会有答案,只是我无法跳出框框思考!
【解决方案3】:

你可以尝试使用mktime()...

【讨论】:

  • 好的,为什么?任何实现OP试图做的例子?
  • date('Y-m-d H:i:s', mktime(date('H'), date('i'), date('s'), date('n'), date('j'), date('Y')-1)) 给出相同的结果。
【解决方案4】:

两个计算都是正确的。但是,如果您想获得相同的日期,但一年前,您应该简单地使用“-1 年”。字符串 '-366 days' 只在闰年正确。

【讨论】:

  • 我认为你误解了我想要做的事情。我想达到 1 年零 1 天前的日期,所以在非闰年 -366 天就可以了,但是在闰年这不起作用,因为它只给出与 -1 年相同的值。
  • 啊,好的。然后使用strtotime('-1 year -1 day')) :)
【解决方案5】:
$date = strtotime('2010-01-01 -1 year');
echo date('Y-m-d', $date); 

输出流看起来像,

2009-01-01

Go this Link for more reference

【讨论】:

    猜你喜欢
    • 2023-03-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-30
    • 1970-01-01
    • 2016-12-07
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多