PHP中的相对时间与绝对时间

时间:2013-06-09 05:01:03

标签: php datetime

请检查以下示例:

$date1 = strtotime("tomorrow 4:00 PM");
$date2 = strtotime("16:00:00");
$date3 = strtotime("10 hours");
$date4 = strtotime("+1 day");

echo date("Y m d H:i:s",$date1)."<br>";
echo date("Y m d H:i:s",$date2)."<br>";
echo date("Y m d H:i:s",$date3)."<br>";
echo date("Y m d H:i:s",$date4)."<br>";

它给出了如下输出:

2013 06 10 16:00:00
2013 06 09 16:00:00
2013 06 09 20:50:25
2013 06 10 10:50:25

我正在考虑前两个例子($ date1和$ date2)作为绝对数据,最后两个作为相对日期。现在,只有给出$ date1 / $ date2 / $ date3 / $ date4变量,是否可以说它是相对时间还是绝对时间?

我确实在另一个帖子上找到了解决方案:PHP datetime string differentiation 但是直到我考虑第二个例子($ date2作为绝对值),它才起作用。此外,可能建议进行正则表达式检查,但这似乎也不可靠。

我只是想知道php是否有一些集成方式来告诉它来自它的函数或DateTime对象。我搜索过,但没有找到任何东西。

期待收听您的建议/反馈/可能的解决方案。感谢。

2 个答案:

答案 0 :(得分:2)

没有直接的方法,AFAIK,但有一个技巧可以用于strtotime函数的第二个参数。

function is_absolute_time($time_string) {
  $time_shift = time() + 60; // 1 min from now

  $time_normal = strtotime($time_string);
  $time_shifted = strtotime($time_string, $time_shift);

  return $time_normal == $time_shifted;
}

理由很简单:如果时间是绝对的,1分钟的差异不会改变strtotime的计算,$time_normal$time_shifted都会相同。但是,对于相对时间,差异将是一分钟($time_shift变量中的值)。

但是这个代码有一个警告。即使是从午夜起不到1分钟的绝对时间(但不是绝对日期),此函数也将返回FALSE。您可以通过将$time_shift更改为:

来最小化此操作
$time_shift = time() + 5; // 5 seconds from now.

此代码现在可以正常工作,直到午夜5秒。我认为你可以安全地低至2.有一个边缘情况,未来1秒可能无效。

要完全解决这个问题,您可以尝试不同的方法:

function is_absolute_time($time_string) {
  $epoch = 0; // Epoch
  $time_shift = 60; // 1 min from epoch

  $time_normal = strtotime($time_string, $epoch);
  $time_shifted = strtotime($time_string, $time_shift);

  return $time_normal == $time_shifted;
}

您可以直接尝试最后一个解决方案。我只是在这篇文章中建立了解决方案的原因。

答案 1 :(得分:0)

只给出值2013 06 10 16:00:00,答案很简单:它是绝对的。无论这个绝对时间戳是创建为“绝对”时间戳还是基于与另一个日期的关系,都无法分辨。你所拥有的只是“2013 06 10 16:00:00”,没有“残余相对性”或其中任何类型的东西。

即使这是相对到基督所谓的诞生,但这与大爆炸以来在太空中漂浮的地球有关... * trollface * < / p>