【问题标题】:adding 1 day to a DATETIME format value将 1 天添加到 DATETIME 格式值
【发布时间】:2010-11-20 03:39:19
【问题描述】:

在某些情况下,我想将 1 天添加到我的 DATETIME 格式化变量的值:

$start_date = date('Y-m-d H:i:s', strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}"));

最好的方法是什么?

【问题讨论】:

    标签: php mysql date datetime


    【解决方案1】:

    在 PHP 5.2 中引入的DateTime 有不止一种方法可以做到这一点。与使用 strtotime() 不同,这将考虑夏令时和闰年。

    $datetime = new DateTime('2013-01-29');
    $datetime->modify('+1 day');
    echo $datetime->format('Y-m-d H:i:s');
    
    // Available in PHP 5.3
    
    $datetime = new DateTime('2013-01-29');
    $datetime->add(new DateInterval('P1D'));
    echo $datetime->format('Y-m-d H:i:s');
    
    // Available in PHP 5.4
    
    echo (new DateTime('2013-01-29'))->add(new DateInterval('P1D'))->format('Y-m-d H:i:s');
    
    // Available in PHP 5.5
    
    $start = new DateTimeImmutable('2013-01-29');
    $datetime = $start->modify('+1 day');
    echo $datetime->format('Y-m-d H:i:s');
    

    【讨论】:

    • 啊,一个循环大循环
    • 如果添加超过一天,您可以使用复数或单数并得到相同的结果,例如:+2 day+2 days(显然+2 days 在语义上更正确)
    • 这些方法之间的实际区别是什么?第一个例子对我来说似乎是最简单和最符合语义的。
    【解决方案2】:

    如果你想在 PHP 中这样做:

    // replace time() with the time stamp you want to add one day to
    $startDate = time();
    date('Y-m-d H:i:s', strtotime('+1 day', $startDate));
    

    如果要在 MySQL 中添加日期:

    -- replace CURRENT_DATE with the date you want to add one day to
    SELECT DATE_ADD(CURRENT_DATE, INTERVAL 1 DAY);
    

    【讨论】:

    • 这不能告诉我当前时间吗?我仍然需要保持用户输入的时间。
    • 是的,但我标记了您应该将哪些值更改为自定义时间。您可以将time() 替换为strtotime("{$_GET['start_hours']}:{$_GET['start_minutes']} {$_GET['start_ampm']}")
    • 这不是夏季/冬季保存!请使用 DST 保存日期/时间操作
    【解决方案3】:

    DateTime 构造函数接受一个参数string time$time 可以是不同的东西,它必须尊重datetime format

    有一些有效值作为例子:

    • 'now'(默认值)
    • 2017-10-19
    • 2017-10-19 11:59:59
    • 2017-10-19 +1day

    因此,在您的情况下,您可以使用以下内容。

    $dt = new \DateTime('now +1 day'); //Tomorrow
    $dt = new \DateTime('2016-01-01 +1 day'); //2016-01-02
    

    【讨论】:

    【解决方案4】:
    1. 使用strtotime 将字符串转换为时间戳
    2. 添加一天(例如:添加 86400 秒 (24 * 60 * 60))

    例如:

    $time = strtotime($myInput);
    $newTime = $time + 86400;
    

    如果只是增加 1 天,那么再次使用 strtotime 可能是矫枉过正。

    【讨论】:

    • 所以我需要将其转换为 TIMESTAMP 然后再转换回 DATETIME 格式?
    • 我想还应该注意的是,并非每天都是 24 小时。在世界上大多数地方,夏令时(夏令时)意味着一年中的一天只有 23 小时,而另一天是 25 小时。
    • 上升。您将日期时间转换为时间戳,因此它基于 UTC。 UTC 天总是 24 小时。当使用date() 转换回来时,会考虑本地时区,这将负责夏令时。
    【解决方案5】:

    你可以使用

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

    【讨论】:

      【解决方案6】:

      你可以如下使用。

      $start_date = date('Y-m-d H:i:s');
      $end_date = date("Y-m-d 23:59:59", strtotime('+3 days', strtotime($start_date)));
      

      您还可以将天数设置为常量并如下使用。

      if (!defined('ADD_DAYS')) define('ADD_DAYS','+3 days');
      $end_date = date("Y-m-d 23:59:59", strtotime(ADD_DAYS, strtotime($start_date)));
      

      【讨论】:

        【解决方案7】:

        我建议从Zend Framework 开始使用Zend_Date 类。我知道,这有点离题,但我会喜欢这种方式:-)

        $date = new Zend_Date();
        $date->add('24:00:00', Zend_Date::TIMES);
        print $date->get();
        

        【讨论】:

        【解决方案8】:

        使用服务器请求时间来添加天数。按预期工作。

        25/08/19 => 27/09/19

        $timestamp = $_SERVER['REQUEST_TIME'];
        $dateNow = date('d/m/y', $timestamp);
        $newDate = date('d/m/y', strtotime('+2 day', $timestamp));
        

        此处“+2 天”可添加任意天数。

        【讨论】:

          【解决方案9】:

          有一种更简洁直观的方式可以为 php 日期添加天数。不要误会我的意思,那些 php 表达式很棒,但你总是要谷歌如何对待它们。我想念自动完成功能。

          我喜欢这样处理这些情况:

          (new Future(
              new DateTimeFromISO8601String('2014-11-21T06:04:31.321987+00:00'),
              new OneDay()
          ))
              ->value();
          

          对我来说,它更直观,自动完成功能开箱即用。无需每次都用谷歌搜索解决方案。

          作为一个不错的奖励,您不必担心格式化结果值,它已经是 ISO8601 格式。

          这是酥皮库,还有更多示例here

          【讨论】:

            猜你喜欢
            • 2014-11-17
            • 2013-09-14
            • 1970-01-01
            • 2017-02-06
            • 1970-01-01
            • 2013-04-07
            • 2021-06-16
            • 1970-01-01
            相关资源
            最近更新 更多