我以一种不寻常的方式存储了一周范围内的一组日期。
日期以这种数字格式存储:12150
从左到右:
第一个数字代表星期:1 = 星期日,2 = 星期一,3 = 星期二,....,7 = 星期六
接下来的两位数字代表 24 小时系统中的小时:00 = 午夜,23 = 晚上 11 点
后两位代表分钟:00-59
给定一个输入日期以及一个开始日期和结束日期,我需要知道输入日期是否在开始日期和结束日期之间。
我现在有一个算法,我认为在 100% 的时间内都有效,但我不确定。
无论如何,我认为可能有更好、更简单的方法来做到这一点,我想知道是否有人知道该算法是什么。
否则,如果有人可以仔细检查我的工作并验证它确实适用于 100% 的有效案例,那就太好了。
我现在拥有的是:
if (startDate < inputDate &&
endDate > inputDate) {
inRange = yes;
}
else if (endDate < startDate) {
if((inputDate + 72359) > startDate &&
(inputDate + 72359) < endDate) {
inRange = yes;
}
else if((inputDate + 72359) > startDate &&
(inputDate + 72359) < (endDate + 72359)) {
inRange = yes;
}
}
最佳答案
怎么样
const int MAX = 72460; // Or anything more than the highest legal value
inRange = (MAX + inputDate - startDate) % MAX <
(MAX + endDate - startDate) % MAX;
这当然假设所有日期都格式正确(根据您的规范)。
这解决了开始在结束“之后”的情况。 (例如,如果开始是星期三而结束是星期一,则星期五在范围内)
可能需要一秒钟才能看到(这可能不好,因为可读性通常是最重要的)但我认为它确实有效。
这是基本技巧:
Legend: 0: Minimum time M: Maximum time S: Start time 1,2,3: Input Time test points E: End Time The S E => Not in range 2 In range 3 > E => Not in range The S > E case 0 M Original -1--E----2---S--3-- Add Max -------------------1--E----2---S--3-- Subtract StartDate ------1--E----2---S--3-- % Max S--3--1--E----2---- 1 In range 2 > E => Not in range 3 In range
If you really want to go nuts (and be even more difficult to decipher)
const int MAX = 0x20000;
const int MASK = 0x1FFFF;
int maxMinusStart = MAX - startDate;
inRange = (maxMinusStart + inputDate) & MASK <
(maxMinusStart + endDate) & MASK;
这应该稍微快一点(按位交易模数和)我们可以做到,因为 MAX 的值并不重要(只要它超过最大格式正确的值)并且我们可以自由地选择一个使我们的计算变得容易的。
(当然,如果您确实需要的话,您可以将 <
替换为 <=
)
关于确定给定日期/时间是否在两个日期/时间对之间的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/637505/