确定给定日期/时间是否在两个日期/时间对之间的算法

标签 algorithm datetime math date mathematical-optimization

我以一种不寻常的方式存储了一周范围内的一组日期。

日期以这种数字格式存储: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/

相关文章:

datetime - 按月/年间隔汇总每日数据

math - 围绕 x,y,z 轴旋转模型,无万向节锁定,输入数据始终为 x,y,z 轴角度旋转

c# - 将纬度/经度转换为 MGRS

ubuntu - 如何从 Dieharder 测试套件中获取随机数?

algorithm - TDOA 多点定位声源

c++ - count_until 和 accumulate_until 的实现?

javascript - 修改后的二分搜索与最佳猜测

python - 使用Python从excel文件中写出没有时间的日期

json - 将 DateTime 转换为 JSON 字符串

Java 递归通过 ArrayList 中的引用传递