【问题标题】:PHP: add seconds to a datePHP:将秒数添加到日期
【发布时间】:2011-05-31 03:13:45
【问题描述】:

我有$adate;,其中包含:

Tue Jan 4 07:59:59 2011

我想在这个日期添加以下内容:

$duration=674165; // in seconds

添加秒数后,我需要将结果恢复为日期格式。

我不知道我在做什么,但我得到了奇怪的结果。

注意:这两个变量都是动态的。现在它们等于给定的值,但下一个查询它们将具有不同的值。

【问题讨论】:

    标签: php date add duration seconds


    【解决方案1】:

    鉴于$adate 是一个时间戳(如果是这种情况),您可以这样做:

    $duration = 674165;
    $result_date = strtotime(sprintf('+%d seconds', $duration), $adate);
    echo date('Y-m-d H:i:s', $result_date);
    

    【讨论】:

    • 或者有什么相同的,可以加$duration$adate
    【解决方案2】:

    如果你使用的是 php 5.3+,你可以使用一种新的方式来做。

    <?php 
    $date = new DateTime();
    echo $date->getTimestamp(). "<br>";
    $date->add(new DateInterval('PT674165S')); // adds 674165 secs
    echo $date->getTimestamp();
    ?>
    

    【讨论】:

    • $date = new \DateTime('+'.$interval.' seconds');
    • 我认为这样更容易:$date-&gt;add(DateInterval::createFromDateString('2 seconds'));如果你想要其他间隔,请看这里:php.net/manual/en/dateinterval.createfromdatestring.php
    • PT674165S中的PT和S是什么?
    • @Andrew 格式以字母 P 开头,表示“句号”。每个持续时间段由一个整数值表示,后跟一个时间段指示符。如果持续时间包含时间元素,则规范的该部分前面带有字母 T。php.net/manual/en/dateinterval.construct.php
    • 啊,谢谢,通过时间元素,您指的是时钟上的时间,而不是天,来自文档中的评论:“为了解决歧义,“P1M”是一个月的持续时间和“ PT1M”是一分钟的持续时间(请注意时间指示符 T,它位于时间值之前)。”但是为什么使用这个而不是@PabloSGPacheco 建议的方法。他的似乎更具可读性。
    【解决方案3】:

    只需使用一些不错的 PHP 日期/时间函数:

    $adate="Tue Jan 4 07:59:59 2011";
    $duration=674165;
    $dateinsec=strtotime($adate);
    $newdate=$dateinsec+$duration;
    echo date('D M H:i:s Y',$newdate);
    

    【讨论】:

    • 我使用 php 已经有一段时间了,它很棒而且一切都很棒(嗯,除了 sucks [which doesn't matter] 时),但我就是不习惯需要多少代码对于最简单的日期时间操作任务,哈哈
    【解决方案4】:

    这样做:

    $seconds = 1;
    $date_now = "2016-06-02 00:00:00";
    
    echo date("Y-m-d H:i:s", (strtotime(date($date_now)) + $seconds));
    

    【讨论】:

      【解决方案5】:
      // add 20 sec to now
      $duration = 20;
      echo date("Y-m-d H:i:s", strtotime("+$duration sec"));
      

      【讨论】:

        【解决方案6】:
        $current_time_zone = 150;
        date("Y-m-d H:i:s",strtotime(date("Y-m-d H:i:s"))+$current_time_zone);
        

        【讨论】:

          【解决方案7】:

          我无法通过strtotime() 解决我的在当前时间添加动态数据/时间值

          的问题

          这是我的解决方案:

          $expires = 3600; //my dynamic time variable (static representation here)
          $date = date_create(date('Y-m-d H:i:s')); //create a date/time variable (with the specified format - create your format, see (1))
          echo date_format($date, 'Y-m-d H:i:s')."<br/>"; //shows the date/time variable without add seconds/time
          date_add($date, date_interval_create_from_date_string($expires.' seconds')); //add dynamic quantity of seconds to data/time variable
          echo date_format($date, 'Y-m-d H:i:s'); //shows the new data/time value
          

          字体:https://secure.php.net/manual/en/datetime.add.php(也可以参考面向对象的样式,Elzo Valugi 解决方案)

          (1)https://secure.php.net/manual/en/function.date.php

          【讨论】:

            【解决方案8】:

            我为时区制作了这个示例,但如果您更改某些部分可能会对您有所帮助:

            $seconds_to_add = 30;
            $time = new DateTime();
            $time->setTimezone(new DateTimeZone('Europe/London'));
            $time2 = $time->format("Y/m/d G:i:s");
            $time->add(new DateInterval('PT' . $seconds_to_add . 'S'));
            $timestamp = $time->format("Y/m/d G:i:s");
            echo $timestamp;
            echo '========';
            echo $time2;
            

            结果:

            2018/06/17 3:16:23========2018/06/17 3:15:53
            

            【讨论】:

              【解决方案9】:

              当我需要执行一些计算时,我总是牢记什么我需要的是什么。例如,如果我需要在日期时间上增加几秒钟,我需要在未来某个地方的日期时间。也就是说,我需要一个名为Future 的类。它是如何识别的?它需要什么数据来运行?似乎应该至少有两个值:一个相对于我需要未来日期的日期时间,以及一个定义开始日期时间和所需日期时间之间时间距离的间隔。

              所以这里有一个代码:

              use Meringue\ISO8601DateTime\FromISO8601 as DateTimeFromISO8601String;
              
              $f =
                  new Future(
                      new DateTimeFromISO8601String('2011-01-04T07:59:59+00'),
                      new NSeconds(674165)
                  );
              

              然后就可以输出ISO8601格式了:

              $f->value(); // returns 2011-01-12T03:16:04+00:00
              

              如果您的初始日期时间不是 ISO8601 格式(在您的示例中就是这种情况),您应该从自定义格式创建一个日期时间,因此使用类的名称 --FromCustomFormat。因为它是一个日期时间,它以 ISO8601 格式表示自己,它扩展了一个名为 ISO8601DateTime 的抽象类。这是一个完整的例子:

              (new Future(
                  new FromCustomFormat(
                      'D M j H:i:s Y',
                      'Tue Jan 4 07:59:59 2011'
                  ),
                  new NSeconds(674165)
              ))
                  ->value();
              

              Here is some more 关于这种方法。

              【讨论】:

                猜你喜欢
                • 2010-12-23
                • 1970-01-01
                • 2013-11-18
                • 1970-01-01
                • 2023-01-19
                • 2016-01-07
                • 1970-01-01
                • 1970-01-01
                • 1970-01-01
                相关资源
                最近更新 更多