0

请检查以下示例:

$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 contrast 但这一直有效,直到我考虑了第二个示例($date2 作为绝对值),它不起作用。此外,可能建议进行正则表达式检查,但这似乎也不可靠。

我只是想知道 php 是否有一些集成的方法可以从它的函数或 DateTime 对象中看出这一点。我搜索了,但没有找到任何东西。

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

4

2 回答 2

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

但是,此代码有一个警告。此函数FALSE甚至会返回距午夜不到 1 分钟的绝对时间(但不是绝对日期)。您可以通过更改$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;
}

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

于 2013-06-09T05:25:52.220 回答
0

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

即使这所谓的基督诞生有关,也与自大爆炸以来漂浮在太空中的地球有关……*巨魔脸*

于 2013-06-09T06:24:27.800 回答