目前,我正在尝试将收到消息的日期解析为时间戳。我有月份和日期,但没有指定年份。事件总是发生在时间的最近(人类)读数。在大多数情况下,这样做效果很好:
$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中有一个选项,它迫使日期在过去而不是未来吗?
有没有其他方法可以解析我应该考虑的这些日期?
效率对这一点很重要,因为我将用它解析很多日期,但我也希望简单易读的代码,以便以后能够理解。