0

我目前正在处理很多可能不确定的日期跨度,即。

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))

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

4

2 回答 2

2

区间算术是一个广泛而复杂的话题。C++/Boost 有一个来处理它。Python也是如此,我猜还有许多其他语言。这是你要问的,还是太笼统了?

至于时间间隔,有这个SO question,可能还有其他你可以在“相关”侧边栏中找到的问题。

于 2010-01-28T07:37:34.497 回答
1

人们通常用三种常见的方式来表示程序中的日期。

  • 在公历中,有年、月、日、时、分、秒。它非常健壮,但很难计算(每四年一个闰年,但不是在世纪上,除非年份是 400 的倍数......你还记得吗?)
  • 作为自特定时间以来的秒数,尽管这会产生问题,因为您必须选择是否计算闰秒(在线搜索“闰秒”,您会明白为什么)
  • 在儒略历中,作为自特定日期以来的天数和自那天开始以来的秒数

至于用作参考的实现,

  • Java 是一个不该做的例子(伙计们,不要创建可变的日期时间类型)
  • Python 也是一团糟(解析日期并不容易)
  • PostgreSQL 很好地处理日期和时间。见http://www.postgresql.org/docs/7.4/interactive/datatype-datetime.html,也可以看源码。它在内部使用儒略历。
  • Haskell 的标准时间库也很不错,并且具有无限的范围和精度——没错,他们使用 bigints 作为 Julian 日期,并使用 bigints 的比率作为时间。该库包含一堆有用的日期函数,包括一个用于计算复活节日期的函数。请参阅http://hackage.haskell.org/package/time
于 2010-01-28T07:48:11.617 回答