【问题标题】:add one year to datetime with php使用 php 将日期时间添加一年
【发布时间】:2011-07-09 21:27:12
【问题描述】:
$data['user']['time'] = '2011-03-07 00:33:45';    

我们怎样才能在这个日期上增加 1 年?

类似$newdata = $data['user']['time'] + 1 year 的东西?

$newdata = 2012-03-07 00:33:45

谢谢

亚当斋月

【问题讨论】:

  • 什么是$data['user']['time']?一个字符串?
  • 应该是日期时间mysql格式。苏里编辑
  • date minus 1 year? 的可能重复项以及数百个现有问题中的所有其他问题,询问“如何 [add/substract] x [s/m/h/d/m/y] to a date” .

标签: php


【解决方案1】:

我认为您可以使用strtotime() 轻松完成此操作。比如:

$newdata = date('c', strtotime($data['user']['time'] . ' +1 year'));

虽然“c”格式字符串与您的输入格式不同。您可以参考 date() 的文档了解如何构建正确的文档。

“Y-m-d H:i:s”——正如 Tim Cooper 所建议的——看起来是正确的。

【讨论】:

  • $newdata = $data['user']['time'] + strtotime("+1 year"); ?
【解决方案2】:

strtotime() 是您要查找的函数:

$data['user']['seal_data'] = date('Y-m-d H:i:s', strtotime('+1 year', strtotime($data['user']['time'])));

【讨论】:

  • 是的,它返回 UNIX 时间戳。你需要使用类似 date() 的东西来重新格式化它。
【解决方案3】:

首先,您必须将 MySQL datetime 转换为 PHP 可以理解的内容。有两种方法可以做到这一点...

  1. 在查询中使用 UNIX_TIMESTAMP() 告诉 MySQL 返回 datetime 列的 UNIX 时间戳。

    SELECT whatever, UNIX_TIMESTAMP(myTime) AS 'myUnixTime' FROM myTable;
    
  2. 使用DateTime::createFromFormat 将字符串时间转换为 PHP 可以理解的时间。

    $date = DateTime::createFromFormat('Y-m-d H:i:s', $data['user']['time']);
    

完成后,您可以使用时间...根据您上面使用的方法,您可以使用以下方法之一。

  1. 如果你有一个unix时间戳,你可以使用下面的添加年份:

    $inAYear = strtotime('+1 year', $data['user']['unixTime']);
    
  2. 如果你有一个DateTime 对象,你可以使用以下:

    $inAYear = $date->add(new DateInterval('P1Y'));
    

现在,要以合适的格式显示您的日期,您必须告诉 PHP 以正确的格式返回一个字符串。

  1. 如果您有 unix 时间戳,则可以使用以下内容:

    $strTime = date('Y-m-d H:i:s', $inAYear);
    
  2. 如果你有一个DateTime 对象,你可以使用以下:

    $strTime = $inAYear->format('Y-m-d H:i:s');
    

或者,如果您不想处理所有这些问题,您可以在查询时简单地添加一年。

SELECT whatever, DATE_ADD(myTime, INTERVAL 1 YEAR) AS 'inAYear' FROM myTable;

【讨论】:

    【解决方案4】:

    这应该可以解决问题(未经测试)。

    $data = "2011-03-07 00:33:45";
    
    echo 'Original date +1 year: ' . date('Y-m-d H:i:s', strtotime(date("Y-m-d H:i:s", strtotime($data)) . " +1 year"));
    

    【讨论】:

    • 你似乎对你的报价有点困惑,但这很有效,很简单,所以投票吧 ;-)
    【解决方案5】:

    当前(2017)实践是使用DateTime

    这个问题在谷歌搜索“php datetime add one year”时名列前茅,但严重过时。虽然大多数以前的答案在大多数情况下都可以正常工作,但已建立的标准是为此使用 DateTime 对象,主要是因为strtotime 需要仔细操作时区和 DST。

    TL;DR

    1. 转换为日期时间$date = new DateTime('2011-03-07 00:33:45', [user TZ]);
    2. 使用DateTime::modify:$date->modify('+1 year');
    3. 根据需要格式化。

    按照此模式操作日期和时间将为您处理最糟糕的时区/夏令时/闰时间。

    请记住最后两个注意事项:

    • 将系统时区设置为 UTC,生活会更轻松。
    • 切勿在配置文件之外修改系统时区。
      • 我见过太多依赖date_default_timezone_set 的代码。如果您正在这样做,请停止。将时区保存在一个变量中,然后将其传递给您的应用程序,

    更多阅读

    How to calculate the difference between two dates using PHP?

    Convert date format yyyy-mm-dd => dd-mm-yyyy

    PHP - strtotime, specify timezone

    【讨论】:

      【解决方案6】:

      首先,如果您的日期格式用斜杠 (/) 分隔,例如 '2019/12/31',那么您应该将其转换为破折号 (-) 格式,例如 ' 2019-12-31',为此使用str_replace() 函数。

      $string = str_replace('/', '-', '2019/12/31'); //output: 2019-12-31
      

      要添加时间/日/月/年,不要使用strtotime() 函数,因为它无法添加超过年份的时间2038。 所以这里我更喜欢使用DateTime()函数。

      $string = '2000-01-01';
      $date = new DateTime($string);
      $date->add(new DateInterval('P60Y5M2DT6H3M25S')); //60 Years 5 Months 2 Days 6 Hours 3 Minutes 25 Seconds
      echo $date->format('Y-m-d H:i:s'); //output: 2060-06-03 06:03:25
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-07-07
        • 1970-01-01
        相关资源
        最近更新 更多