【问题标题】:Convert DateInterval object to seconds in php在php中将DateInterval对象转换为秒
【发布时间】:2012-12-26 00:03:44
【问题描述】:
$datetime1 = date_create('2009-10-11');
$datetime2 = date_create('2009-10-13');
$interval = date_diff($datetime1, $datetime2);

我如何将上面的$interval 转换为 php 中的秒数

【问题讨论】:

  • 请注意,分钟和小时都不是精确的时间单位。一分钟可能跨越 59、60 或 61 秒,一小时可能包含 3599、3600 或 3601 秒。将月份转换为秒完全是无稽之谈。

标签: php date time seconds


【解决方案1】:

为此有一个函数format。但它不会返回秒数。要获得使用此技术的秒数

$seconds = abs($datetime1->getTimestamp()-$datetime2->getTimestamp());

如果你真的想使用$interval,你需要计算它。

$seconds = $interval->days*86400 + $interval->h*3600 
           + $interval->i*60 + $interval->s;

这里

  • 86400 是一天中的秒数
  • 3600 是一小时的秒数
  • 60 是一分钟的秒数

【讨论】:

  • 它正在返回0 seconds
  • @MarkBaker 是的,这就是我改变答案的原因
【解决方案2】:

另一种获取间隔秒数的方法是将其添加到零日期,并获取该日期的时间戳:

$seconds = date_create('@0')->add($interval)->getTimestamp();

此方法将或多或少正确地处理通过 DateInterval 构造函数创建的间隔,而shiplu's answer 将忽略此类间隔的年、月和日。但是,shiplu 的答案对于通过减去两个日期创建的间隔更准确。对于只包含小时、分钟和秒的时间间隔,这两种方法都会得到正确的答案。

【讨论】:

  • @Brilliand 为什么这个解决方案对于通过减去两个日期创建的间隔不太准确?我不明白怎么做。你能解释一下吗?
  • @MaxiWheat 假设时间间隔是通过从 2015-03-01 中减去 2015-02-01 创建的。这是一个月的差异,恰好等于 28 天。 Shiplu 的方法将其视为 28 天的间隔,而我的方法将其视为一个月的间隔,任意选择 1 月为月份,并根据 1 月的 31 天生成时间戳。
【解决方案3】:

我只会添加到shiplu's answer:

function dateIntervalToSeconds($interval)
{
    $seconds = $interval->days*86400 + $interval->h*3600 
       + $interval->i*60 + $interval->s;
    return $interval->invert == 1 ? $seconds*(-1) : $seconds;
}

处理负区间。

请注意 - 与 Brilliand's answer 相反 - 上面的代码将正确考虑年份、月份和日期。因为 $interval->days 是一个绝对值($interval->d 是相对于月份而言的)。

编辑:正如@Brilliand 所指出的,这个函数仍然不正确。一个反例是

new DateInterval('P4M3DT2H'); 

它不能很好地处理几个月。

【讨论】:

  • new DateInterval('P4M3DT2H') 是失败的间隔示例。试试看 - days 变量是空的,尽管间隔大约跨越 123 天。
  • 以后,如果你要指责我错了,我要求你在对我的回答发表评论时这样做。我花了很长时间才注意到这一点。
  • @Brilliand,你是对的。我相应地编辑了我的答案。
  • 这不仅仅是几个月。试试new DateInterval('P3D') - days 变量仍然为空。使用 new 创建的 DateInterval 永远不会填充该变量。这就是我所说的“DateInterval 构造函数”的意思。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-14
相关资源
最近更新 更多