假设我有一个日期时间,2011年6月16日7:00。我希望能够在2011年8月5日7:00进行检查,并能够判断出这是自第一次约会以来1天的整数倍,而7:01不算在内,因为这不是整数倍。
另一个测试集:假设我们有2011年6月16日的7:00,我想检查一下从那以后某一分钟是否正好在2小时的间隔内。因此,9点、11点、13点等时间会起作用,但9点30分和10点不起作用。这种情况可能会持续数天甚至数月——9月1日7点仍然算作每2小时一次。(不,目前我不知道该如何处理DST:D)
我想了一会儿,想不出PHP或MySQL中已经存在的任何东西可以轻松做到这一点,但见鬼,它可以,所以我想在开始重新发明轮子之前抛出这个问题。
遗憾的是,这是在PHP 5.1上。
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小时的倍数。
最简单的方法是将日期/时间值转换为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 ...
}
天/周的比较也是如此。几个月后,这将是不可能的,因为几个月甚至都不是好数字。
MySQL日期函数:http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html
您可以使用TIME()只获取日期的时间部分。如果时间部分是相同的,那么它就是一个精确的倍数。
对于两个小时的事情,一种方法是获取日期的分/秒部分,确保它们相等,然后确保日期的小时部分都是偶数或奇数。对于更复杂的整数(例如5)小时倍数,您可以通过划分小时部分并检查结果是否为整数来"伪造"mod。
您可以通过diff()方法比较两个DateTime对象。结果是一个DateInterval对象-您可以检查两个日期之间的确切天数/小时/分钟。
如果可以使用内置功能,那么编写自己的算法是没有用的。