代码之家  ›  专栏  ›  技术社区  ›  efritz

以PHP DateInterval计算总秒数

  •  78
  • efritz  · 技术社区  · 14 年前

    $delta   = $date->diff(new DateTime('now'));
    $seconds = $delta->days * 60 * 60 * 24;
    

    然而 days DateInterval对象的属性似乎在当前PHP5.3版本中被破坏(至少在Windows上,它总是返回相同的值) 6015 值)。我还试图用一种方法来保存每个月的天数(循环到30天),闰年,等等:

    $seconds = ($delta->s)
             + ($delta->i * 60)
             + ($delta->h * 60 * 60)
             + ($delta->d * 60 * 60 * 24)
             + ($delta->m * 60 * 60 * 24 * 30)
             + ($delta->y * 60 * 60 * 24 * 365);
    

    5 回复  |  直到 14 年前
        1
  •  221
  •   Ben    14 年前

    你能不能比较一下 time stamps

    $now = new DateTime('now');
    $diff = $date->getTimestamp() - $now->getTimestamp()
    
        2
  •  34
  •   dave1010    10 年前

    此函数允许您从DateInterval对象获取以秒为单位的总持续时间

    /**
     * @param DateInterval $dateInterval
     * @return int seconds
     */
    function dateIntervalToSeconds($dateInterval)
    {
        $reference = new DateTimeImmutable;
        $endTime = $reference->add($dateInterval);
    
        return $endTime->getTimestamp() - $reference->getTimestamp();
    }
    
        3
  •  4
  •   xil3    14 年前

    $currentTime = time();
    $timeInPast = strtotime("2009-01-01 00:00:00");
    
    $differenceInSeconds = $currentTime - $timeInPast;
    

        4
  •  4
  •   Shoe    12 年前
    static function getIntervalUnits($interval, $unit)
    {
        // Day
        $total = $interval->format('%a');
        if ($unit == TimeZoneCalc::Days)
            return $total;
        //hour
        $total = ($total * 24) + ($interval->h );
        if ($unit == TimeZoneCalc::Hours)
            return $total;
        //min
        $total = ($total * 60) + ($interval->i );
        if ($unit == TimeZoneCalc::Minutes)
            return $total;  
        //sec
        $total = ($total * 60) + ($interval->s );
        if ($unit == TimeZoneCalc::Seconds)
            return $total;  
    
        return false;
    }
    
        5
  •  0
  •   migli    4 年前

    DateTime::diff DateInterval 两个日期之间的对象。

    这个 日期间隔 对象提供所有信息(天数、小时、分钟、秒)。

    /**
     * intervalToSeconds
     *
     * @param  DateInterval $interval
     * @return int
     */
    function intervalToSeconds(\DateInterval $interval) {
        return $interval->days * 86400 + $interval->h * 3600 + $interval->i * 60 + $interval->s;
    }
    
    $date_1 = new \DateTime('2021-03-03 05:59:19');
    $date_2 = new \DateTime('now');
    $interval = $date_1->diff($date_2);
    echo intervalToSeconds($interval);
    
        6
  •  -2
  •   Vadim Samokhin    5 年前

    当你 你需要的已经作为一个类出现了。在您的情况下,您需要总秒数。为什么不把它做成一节课呢?代码可能是这样的:

    (new TotalFullSeconds(
        new IntervalFromRange(
            new DateTimeFromISO8601String('2017-07-03T14:27:39+00:00'),
            new DateTimeFromISO8601String('2017-07-05T14:27:39+00:00')
        )
    ))
        ->value()
    

    要获得更有用的实现,您可以 this library .

        7
  •  -8
  •   Duniyadnd    14 年前

    你可以输入硬数字(而不是60*60—输入3600),这样就不需要每次都计算。