【问题标题】:What is the best way to handle bc dates in .net / sql server?在 .net / sql server 中处理 bc 日期的最佳方法是什么?
【发布时间】:2011-06-30 19:57:04
【问题描述】:

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

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

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

【问题讨论】:

标签: c# .net sql sql-server


【解决方案1】:

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

【讨论】:

  • 这个项目看起来很有希望。我希望在下一个视图月有一个稳定的版本。我喜欢它支持部分日期,因为有许多不知道月份或日期的历史事件。 Jon Skeet 有一个presentation on infoq.com
【解决方案2】:

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

【讨论】:

  • 我考虑将日期存储在 3 个单独的列中,因为有时只知道特定事件的年份和月份。例如,您可以使用 1712-01-01,但这实际上不是正确的数据。当然,您会丢失 Datetime 类型的验证部分(例如,这个日期是否真的存在)。
  • @fnx 使用 int 可以使用多年,因为一旦你真的老了,日历系统就会不同,所有内置的日期验证代码都会被扔出窗外。
【解决方案3】:

这里最好的建议是不要依赖 Microsoft 获取日期时间值。更好的解决方案是编写自己的儒略日期类并处理从书面日期(例如上面的亚里士多德)到儒略日期的转换。

1/1/322 BC = 1603447.5
1/1/384 BC = 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

【讨论】:

    猜你喜欢
    • 2013-02-26
    • 1970-01-01
    • 2018-03-16
    • 1970-01-01
    • 1970-01-01
    • 2011-09-16
    • 1970-01-01
    • 2010-09-06
    • 2010-10-05
    相关资源
    最近更新 更多