PHP - 将字符串解析为过去的日期

时间:2016-01-07 10:08:33

标签: php date strtotime

目前,我正在尝试解析收到邮件到时间戳的日期。我有月份和日期,但未指定年份。事件总是发生在最近(人类)的时间读数上。在大多数情况下,这样做很有效:

$time = strtotime("Jan 2 8:38pm");

返回今年的日期,这是正确的。不幸的是,当我尝试做的时候,我遇到了问题:

$time = strtotime("Dec 31 8:38pm");

返回一个尚未发生的日期,并且在一年中的其余时间都不会发生。显然,我的消息将来不会发送。我需要它回到去年12月31日。

对于工作日,我有一个解决方案,通过前置'最后一个'在工作日之前如此:

$time = strtotime("Last Saturday 8:38pm");

总是返回上周六的时间。但是,尝试在此处做同样的事情并不起作用:

$time = strtotime("Last Dec 31 8:38pm");

返回false。我知道将日期减少1年,我可以这样做:

$time = strtotime("Dec 31 8:38pm -1 year");

这对12月31日来说非常有效。但是,1月2日现在将失败:

$time = strtotime("Jan 2 8:38pm -1 year");

我想到的一个解决方案是,如果超过今天的日期,则从结果值中减去一年(86400 * 365)。但是,如果我们超过闰年的2月份,这个结果就会失败。在这种情况下,我们最终会有一天的时间。

到目前为止,我提出的最佳解决方案是:

$time = strtotime($raw_time);
if ($time > time()) {
  $time = strtotime($raw_time." -1 year");
}

对strtotime进行两次调用似乎有点浪费,我知道这可能不是一个非常有效的函数。这是最优雅的解决方案吗?

是否有人知道strtotime中的一个选项会强制日期过去而不是将来?

还有其他方法可以解析我应该考虑的这些日期吗?

效率对此非常重要,因为我将使用它解析很多日期,但我还想要简单易读的代码,以便稍后理解。

1 个答案:

答案 0 :(得分:1)

您的方法很好,因为没有日期格式可以获得您想要的内容。另一种方法可能是使用DateTime类:

$datetime = new DateTime($raw_time);
if ($datetime > new DateTime()) {
    $datetime->modify('-1 year');
}

您可以测试两种方法中的哪一种更快。我的猜测是,这是一种不会产生很大差异的微优化。