代码之家  ›  专栏  ›  技术社区  ›  azoundria

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

  •  0
  • azoundria  · 技术社区  · 8 年前

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

    $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 回复  |  直到 8 年前
        1
  •  1
  •   mavroprovato    8 年前

    你的方法很好,因为没有日期格式可以得到你想要的。另一种方法可以是使用 DateTime 类别:

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

    您可以测试这两种方法中哪一种更快。我的猜测是,这是一个微优化,不会有太大区别。