值间隔的函数

时间:2010-01-28 07:27:34

标签: language-agnostic datetime function range intervals

我目前正在处理许多可能无限期的日期跨度,即

StartDate     EndDate
---------     ---------
01JAN1921     31DEC2009
10OCT1955     null
...

其中间隔的另一端可能未知或未定义。我一直在研究用于检测重叠的小函数,一个区间是否是另一个区间,计算两个区间之间的间隙等。

例如,为了检测重叠,问题是

        S       E            S and E are the start and end of the interval
        |       |            we're comparing to. Here both are known, but
s1------+---e1  |            either could be null. The small s:s and e:s 
        |       |  s2....e2  define the intervals we're comparing to and
        |s3--e3 |            again we'd like to allow for open intervals.
        |   s4--+----e4
  s5..e5|       |
    s6--+-------+--s7
        |       |

基于与检测到明确间隔的重叠相关的问题,您需要检查

    Coalesce(S,Coalesce(e-1,0))<Coalesce(e,Coalesce(S+1,1))
AND Coalesce(E,Coalesce(s+1,0))>Coalesce(s,Coalesce(E-1,1))

我认为这是一个很常见的事情(不仅涉及日期或时间间隔),许多人一直在处理它。我正在寻找现有的实现,最好只是基于基本比较操作的函数。

2 个答案:

答案 0 :(得分:2)

Interval arithmetic是一个广泛而复杂的话题。 C ++ / Boost有一个library来处理它。 Python也是,我想其他许多语言。这是你要问的问题,还是这个太笼统了?

至于时间间隔,有SO question,可能还有其他人可以在“相关”侧栏中找到。

答案 1 :(得分:1)

人们通常在节目中代表日期的三种常见方式。

  • 在公历中,包括年,月,日,小时,分钟,秒。这是非常强大的,但很难做数学(每四年闰年,但不是几个世纪,除非年份是400的倍数......你还记得吗?)
  • 作为自特定时间以来的秒数,虽然这会产生问题,因为您必须选择是否计算闰秒(在线搜索“闰秒”并且您会看到原因)
  • 在朱利安日历中,自特定日期起的天数以及自该日开始以来的秒数

至于用作参考的实现,

  • Java是一个不做的事情的例子(伙计们,不要创建可变的日期时间类型)
  • Python也是一团糟(没有简单的方法来解析日期)
  • PostgreSQL处理日期和时间非常好。请参阅http://www.postgresql.org/docs/7.4/interactive/datatype-datetime.html,您还可以查看源代码。它在内部使用儒略历。
  • Haskell的标准时间库也很好,并且具有无限的范围和精度 - 这是正确的,他们使用bigint作为Julian日期和当时bigint的比率。该库包括一堆有用的日期函数,包括一个用于计算复活节落日的日期函数。见http://hackage.haskell.org/package/time