目前,我正在尝试解析收到邮件到时间戳的日期。我有月份和日期,但未指定年份。事件总是发生在最近(人类)的时间读数上。在大多数情况下,这样做很有效:
$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中的一个选项会强制日期过去而不是将来?
还有其他方法可以解析我应该考虑的这些日期吗?
效率对此非常重要,因为我将使用它解析很多日期,但我还想要简单易读的代码,以便稍后理解。
答案 0 :(得分:1)
您的方法很好,因为没有日期格式可以获得您想要的内容。另一种方法可能是使用DateTime
类:
$datetime = new DateTime($raw_time);
if ($datetime > new DateTime()) {
$datetime->modify('-1 year');
}
您可以测试两种方法中的哪一种更快。我的猜测是,这是一种不会产生很大差异的微优化。