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

我打算创建一个时间线应用程序来存储和显示特定日期的信息。 例如:亚里士多德公元前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中解析这些值?

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

这里最好的建议是不要依赖Microsoft的datetime值。 更好的解决方案是编写自己的Julian日期类,并处理从书面日期(例如上面的亚里士多德)到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 

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