在.net / sql server中处理bc日期的最佳方法是什么?

时间:2011-02-20 17:33:16

标签: c# .net sql sql-server

我打算创建一个时间轴应用程序来存储和显示特定日期的信息。 例如:亚里士多德公元前384年 - 公元前322年;还有伊曼纽尔康德的广告日期22.04.1724 - 12.02.1804)。

我想使用sql compact edition数据库。日期时间格式允许日期为1/1/1753 12:00:00:00 AM至12/31/9999 11:59:59 PM。所以我不能使用原生日期时间格式。 .Net也不允许使用本机DateTime类的bc日期(0001.01.01是第一天)。

我是否必须使用varchar列定义自己的格式,并在.Net中解析这些值?

3 个答案:

答案 0 :(得分:7)

你可以看看noda-time,这是.NET的Joda-time的一个端口,它可以处理历史日期(但你仍然需要自己处理持久性)。

答案 1 :(得分:2)

这里最好的建议是不要依赖Microsoft的datetime值。更好的解决方案是编写自己的Julian日期类,并处理从书面日期(例如上面的Aristotle)到Julian日期的转换。

公元前1/1/322 = 1603447.5
公元前1/1/384 = 1580801.5

Sub GetJD(mn%, dy%, yr%, ByRef JD#)
    Dim c#
    c# = 12# * (yr% + 4800) + mn% - 3
    JD# = Int(c# / 48) + Int((365 * c# + 2 * (c# - 12 * Int(c# / 12)) + 7) / 12) + dy% - 32083
    If JD# > 2299170! Then JD# = JD# + Int(c# / 4800) - Int(c# / 1200) + 38
    JD# = JD# - 0.5 ' = 0 hrs GMT
End Sub

答案 2 :(得分:1)

将年份分别存储为有符号整数。如果您需要该年内的特定日期,请保留一个单独的日期时间列,并使用年份部分的标准值(1900是常见的)。