【问题标题】:find if date is older than 30 days查找日期是否超过 30 天
【发布时间】:2011-10-31 03:19:32
【问题描述】:

日期字符串如下所示

2011-08-19 17:14:40

(年-月-日时:分:秒)

如何知道日期是否早于当前日期超过 30 天?

【问题讨论】:

    标签: php string datetime date time


    【解决方案1】:

    尝试使用这样的东西:

     if(strtotime('2011-08-19 17:14:40') < strtotime('-30 days')) {
         // this is true
     }
    

    此外,这个字符串看起来像是作为日期时间/时间戳字段存储在 SQL 中。您可以使用以下方法直接从数据库中选择所有具有旧日期的条目:

    SELECT ... WHERE `datetime` + INTERVAL 30 DAY < NOW()
    

    【讨论】:

    • 请注意,月份可能有 4 天组合:28、29 30 和 31。
    • 请注意,问题和答案都不使用单词月份(除了描述pf格式)
    【解决方案2】:
    strtotime('2011-08-19 17:14:40') + 30 * 24 * 60 * 60 < time();
    

    【讨论】:

    • 应该是strtotime('2011-08-19 17:14:40') + 30 * 24 * 60 * 60 &lt; time(); 更正吧。
    • @nobody 你有 >2000 代表。你可以自己纠正,就像我做的那样。 :)
    • @gion_13 进行这种24 * 60 * 60 计算通常是个坏主意,因为在处理夏令时等问题时它们可能会变得不准确。最好使用 RiaD 建议的东西,让strtotime() 处理相对时间计算。
    • strtotime('2011-08-19 17:14:40')+(30 * 86400)
    • @Agent 我不同意你上面的观点,30 * 24 * 60 * 60 永远是 30 days,无论你在宇宙的哪个角落。
    【解决方案3】:

    您可以按如下方式使用 Carbon

    if (30 - ((new \Carbon\Carbon($given_date, 'UTC'))->diffInDays()) < 0) {
        echo "The date is older than 30 days";
    }
    

    【讨论】:

      【解决方案4】:

      如果你使用的是 PHP 5.3 或更高版本,你可以这样做:

      $someDate = new \DateTime('2011-08-19 17:14:40');
      $now = new \DateTime();
      
      if($someDate->diff($now)->days > 30) {
         echo 'The date was more than 30 days ago.';
      }
      

      【讨论】:

      • 你能链接到 diff($now)->days 的文档吗?我想调整它几个小时而不是几天。谢谢。
      • diff 返回一个DateInterval。 DateInterval 有一个“小时”的h 属性,但它实际上是差异的一部分(因为它与 y(年)、m(月)、d(天)等有关)。为了获得时间,我会做($now-&gt;getTimestamp() - $someDate-&gt;getTimestamp()) / 3600。这将返回一个小数。然后,如果您希望将其用作整数,则可以选择使用 round()intval() 等。
      • 我比接受的答案更喜欢这个答案。 diff 方法看起来很优雅。
      • 一个班轮:(new DateTime('2021-08-10'))-&gt;diff(new DateTime())-&gt;days &gt; 30
      【解决方案5】:

      使用meringue 库,这至少可以通过两种方式完成。

      第一个如下所示:

      (new Future(
          new DateTimeParsedFromISO8601String('2011-08-19 17:14:40'),
          new NDays(30)
      ))
          ->earlierThan(
              new Now()
          );
      

      语义如下:首先,从 ISO8601 字符串中解析一个日期,然后创建一个比该日期晚 30 天的未来日期,最后将其与当前日期时间比较,即now

      第二种方法是从日期时间范围创建一个间隔并计算它所包含的天数。看起来是这样的:

      (new TotalFullDays(
          new FromRange(
              new FromISO8601('2011-08-19 17:14:40'),
              new Now()
          )
      ))
          ->value();
      

      这两种方法都非常直观,不会让您记住特殊的 php 日期时间表达式。相反,每个实现都是自动完成的;您只需要构建一个适合您需求的正确对象。

      【讨论】:

      • 在我看来,这对于这个问题来说似乎有点过头了。还有更简单的普通 php 选项
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2011-12-26
      • 1970-01-01
      • 2011-04-21
      • 1970-01-01
      • 2016-07-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多