【问题标题】:How to find if a date fits an interval in either PHP or MySQL?如何查找日期是否适合 PHP 或 MySQL 中的间隔?
【发布时间】:2011-09-12 01:09:27
【问题描述】:

假设我有一个日期时间,即 2011 年 6 月 16 日 7:00。我希望能够在 2011 年 8 月 5 日 7:00 进行检查,并能够判断它恰好是自第一次约会以来 1 天的倍数,而 7:01 不算数,因为它不是精确倍数。

另一个测试集:假设我们有 2011 年 6 月 16 日 7:00,我想检查特定分钟是否在从那时起正好 2 小时的间隔内。所以 9:00、11:00、13:00 等会计算在内,但 9:30 和 10:00 不会。这可能会持续数天和数月 - 9 月 1 日 7:00 仍然算作每 2 小时内。 (不,目前我不知道我将如何处理 DST :D)

我想了一会儿,想不出任何已经存在于 PHP 或 MySQL 中的东西可以轻松地做到这一点,但见鬼,它可以,所以我想在开始重新发明轮子之前提出这个问题并询问。

遗憾的是,这是在 PHP 5.1 上的。

【问题讨论】:

    标签: php mysql datetime intervals


    【解决方案1】:

    MySQL 日期函数: http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html

    1. 您可以使用 TIME() 来获取日期的时间部分。如果时间部分相同,则为精确倍数。

    2. 对于两个小时的事情,一种方法是获取日期的分钟/秒部分,确保它们相等,然后确保日期的小时部分都是偶数或都奇怪。对于更复杂的整数(例如 5)小时倍数,您可以通过除以小时部分并检查结果是否为 int 来“伪造”做 mod。

    【讨论】:

    • 哦,好点子。 7:00 永远是 7:00,以此类推。但是,如果我说,6 月 15 日,早上 7 点,我想要每 5 小时打勾。奇数,所以 6 月 16 日早上 7 点不符合条件。 :)
    【解决方案2】:

    最简单的方法是将日期/时间值转换为 unix 时间戳,然后简单地做一些减法/除法:

    2011-06-16 07:00:00 -> 1308229200
    2011-08-05 07:00:00 -> 1312549200
    2011-08-05 07:00:01 -> 1312549201
    
    1312549200 - 1308229200 = 4320000 / 86400 = 50 (days)
    1312549201 - 1308229200 = 4320001 / 86400 = 50.0000115...
    

    换句话说:

    if (($end_timestamp - $start_timestamp) % 864000)) == 0) {
      ... even multiple ...
    }
    

    同样适用于日/周比较。几个月后,这将不复存在,因为几个月都不好处理。

    【讨论】:

    • 希望能够在这几个月内完成......嗯。然而,这实际上很简单:只需检查一个月中的哪一天。如果相等,运行它。并且不要让他们在 29 日、30 日或 31 日安排事情,而没有简单的“每月最后一天”的额外选项:)
    • 如果这是用于预订系统,并且您想限制这些类型的时间间隔,则不允许任意日期输入。让脚本吐出仅列出允许间隔的下拉菜单。
    【解决方案3】:

    您可以通过diff() 方法比较两个 DateTime 对象。结果是 DateInterval 对象 - 您可以检查两个日期之间的确切天数/小时/分钟数。

    如果可以使用内置功能,编写自己的算法是没有用的。

    【讨论】:

    • 很遗憾,我很抱歉没有在我的帖子中包含这个,但我目前被困在 PHP 5.1 中。
    • 你应该要求 PHP 5.3。在 2011 年费心搞 5.1 只是浪费时间。
    • 哦,我有。但是我们被锁定在 RHEL 5.whatever 只正式支持 PHP 5.1。 (它有 5.3 但没有我们想要的插件)
    【解决方案4】:
    select *
    from test
    where datetimefield > '2011-06-16 07:00:00'
    and
    mod(timestampdiff(second,'2011-06-16 07:00:00',datetimefield),7200) = 0
    

    此示例将为您提供大于“2011-06-16 07:00:00”的所有记录,其中字段正好是 2 小时的倍数。

    【讨论】:

    • 时间戳差异!我们似乎有一个赢家!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-03-28
    • 2021-06-27
    • 1970-01-01
    • 2016-10-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多