【问题标题】:Subtract 1 day with PHP用 PHP 减去 1 天
【发布时间】:2011-11-30 20:44:09
【问题描述】:

我正在尝试从我的 Drupal CMS 中获取一个日期对象,减去一天并打印出两个日期。这就是我所拥有的

$date_raw = $messagenode->field_message_date[0]['value'];

print($date_raw);

//this gives me the following string: 2011-04-24T00:00:00

$date_object = date_create($date_raw);

$next_date_object = date_modify($date_object,'-1 day');

print('First Date ' . date_format($date_object,'Y-m-d'));

//this gives me the correctly formatted string '2011-04-24'

print('Next Date ' . date_format($next_date_object,'Y-m-d'));

//this gives me nothing. The output here is always blank

所以我不明白为什么原来的日期对象会很好,但是我试图创建一个额外的日期对象并通过减去一天来修改它,似乎我不能这样做。输出总是空白。

【问题讨论】:

    标签: php datetimeoffset


    【解决方案1】:

    你可以试试:

    print('Next Date ' . date('Y-m-d', strtotime('-1 day', strtotime($date_raw))));
    

    【讨论】:

    • 你可以得到与$date_raw = date("r");相同格式的$date_raw
    • 小心!如果你处理日期 2038 年之后,由于 PHP 中的整数大小限制(至少在 32 位平台上),它将无法工作)。在这种情况下,最安全的解决方案是使用DateTime (see here)。
    【解决方案2】:

    不确定为什么您当前的代码无法正常工作,但如果您不特别需要日期对象,这将起作用:

    $first_date = strtotime($date_raw);
    $second_date = strtotime('-1 day', $first_date);
    
    print 'First Date ' . date('Y-m-d', $first_date);
    print 'Next Date ' . date('Y-m-d', $second_date);
    

    【讨论】:

    • 谢谢克莱夫!那个对我有用……是的,我真的不需要日期对象,我只需要打印格式化的日期。
    【解决方案3】:
     date('Y-m-d',(strtotime ( '-1 day' , strtotime ( $date) ) ));
    

    【讨论】:

      【解决方案4】:

      面向对象的版本

      $dateObject = new DateTime( $date_raw );
      print('Next Date ' . $dateObject->sub( new DateInterval('P1D') )->format('Y-m-d');
      

      【讨论】:

      • 您的答案是增加一天而不是减少一天。除此之外,这将是我的首选解决方案。
      【解决方案5】:

      这个怎么样:先把它转换成一个unix时间戳,减去60*60*24(正好是一天,以秒为单位),然后从中获取日期。

      $newDate = strtotime($date_raw) - 60*60*24;
      echo date('Y-m-d',$newDate);
      

      注意:正如 apokryfos 所指出的,从技术上讲,这会因夏令时更改而被抛弃,其中一天是 25 或 23 小时

      【讨论】:

      • 好的,只有我是这样的:$newDate =date_create($date_raw)->getTimestamp() - 60*60*24;
      • 这假设所有的日子都是 24 小时,这在世界上少数人将时钟移动 +/- 1 小时以提供更多或更少阳光的错觉的那两天中是不正确的。然后还有闰秒。
      • 这是一个很好的收获@apokryfos。我不会将其用于超级科学的计算,但在绝大多数情况下,它应该仍然没问题。
      【解决方案6】:

      单线选项是:

      echo date_create('2011-04-24')->modify('-1 days')->format('Y-m-d');
      

      Online PHP Editor 上运行它。


      mktime替代

      如果您希望避免使用字符串方法,或者进行计算,甚至创建额外的变量,mktime 支持以下方式的减法和负值:

      // Today's date
      echo date('Y-m-d'); // 2016-03-22
      
      // Yesterday's date
      echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-1, date("Y"))); // 2016-03-21
      
      // 42 days ago
      echo date('Y-m-d', mktime(0, 0, 0, date("m"), date("d")-42, date("Y"))); // 2016-02-09
      
      //Using a previous date object
      $date_object = new DateTime('2011-04-24');
      echo date('Y-m-d',
        mktime(0, 0, 0,
           $date_object->format("m"),
           $date_object->format("d")-1,
           $date_object->format("Y")
          )
      ); // 2011-04-23
      

      Online PHP Editor

      【讨论】:

        【解决方案7】:
        $date = new DateTime("2017-05-18"); // For today/now, don't pass an arg.
        $date->modify("-1 day");
        echo $date->format("Y-m-d H:i:s");
        

        使用 DateTime 显着减少了操作日期时的头痛。

        【讨论】:

        • date_create 是调用DateTime constructor 的过程方法,它允许您在不使用new 的情况下将3 行减少为1 行。 IE。 echo date_create('2017-05-18')->modify('-1 day')->format('Y-m-d H:i:s');
        • 嗯,原来asnwer的代码也可以写成1行,比如:(new \DateTime("2017-05-18"))->modify("-1 day")->format("Y-m-d H:i:s")
        【解决方案8】:

        如何在 asp.net c# 中将 1 年添加到日期,然后从中减去 1 天

        Convert.ToDateTime(txtDate.Value.Trim()).AddYears(1).AddDays(-1);
        

        【讨论】:

        • 这不是 PHP。
        【解决方案9】:

        Answear 取自 PHP 手动 strtotime 函数 cmets :

        echo date( "Y-m-d", strtotime( "2009-01-31 -1 day"));
        

        或者

        $date = "2009-01-31";
        echo date( "Y-m-d", strtotime( $date . "-1 day"));
        

        【讨论】:

          【解决方案10】:

          您可以在date() 中添加strtotime(),参数为星期或月份的天数。例如,日 date("Y-m-d", strtotime("-1 day")); 一周 date("Y-m-d", strtotime("-1 week")); 一个月 date("Y-m-d", strtotime("-1 months"));

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2021-12-31
            • 1970-01-01
            • 1970-01-01
            • 2013-02-03
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多