C#/.NET中处理公元前日期的最佳方法是什么?

20

有没有内置的支持?如果没有,是否有关于处理这种日期的共识?


自己编写的解决方案链接或其片段都非常受欢迎。


只是好奇 - 为什么?你正在查看至少两个不同的日历 - 公元前40多年的儒略日历和公元1580年左右的格里高利日历,它们每月的天数、年份等都不同。听起来像是一场噩梦。 - n8wrl
1
偶数年是否准确,不考虑日历?时间偏移难道不超过1.0年吗? - John Saunders
虽然我不是历史专家,但这个概括听起来太简单了。希望对你的需求不会过于简化。如果你找到一个开发“历史软件”的社区,你可能会发现他们对日期的概念比你的复杂得多。 - John Saunders
1
John,这是一个复杂的函数,有很多参数(比如日历是在地球上的哪个地方引入的),但是内部每个日期只能由一个数据点表示:自某个参考时间以来经过的滴答数。如何将其表示给外部世界,当然可能非常复杂。 - Peter
1
看一下NodaTime:https://dev59.com/questions/mo7ea4cB1Zd3GeqPErSz?rq=1 - Andrew Jens
显示剩余4条评论
4个回答

9

1
我会自己编码,但只是来这里看看是否有什么现成的东西我错过了。 - Peter
代码位置TX也是可以的,但恐怕不符合我的需求。其他链接非常欢迎。 - Peter
3
以防那种情况再次发生,请在这个回答中包含链接帖子的关键部分,这样我们就不会再被留下一个没有用的一行代码了。谢谢! - BoltClock

5
如果您正在参考处理小于DateTime.MinValue的DateTime值,则我认为唯一的“共识”是不要使用System.DateTime来表示它们。
任何共识可能仅存在于处理此类日期的社区内。您所在的领域是什么?天文学?
无论感兴趣的领域是什么,都可能有其他人遇到了同样的问题。首先进行一些研究,特别是如果您的日期将需要与该领域中的其他软件进行交互操作。即使您必须编写自己的代码,您也可以至少了解其他人在编写自己的代码时遇到的问题。

不是天文学,而是历史。 - Peter
没有怀疑历史;你没有说“公元前”。 - John Saunders
2
或者仅相对于您在外部定义的纪元使用它们。 - Marc Gravell

3
我知道这个问题早已过时,但我在搜索中找到了它,并且可以为这个话题添加额外的见解。 在上面的评论中,有人认为日期差异将超过1年。 除非计划回到远古无法得出确切日期的时间(数千年前),否则并不是这种情况。 无论是朱利安日期还是格里高利日期所需的差异都只是几天而已,对于任何一个可以合理尝试从现有历史记录中推导出的特定日期,这种差异肯定少于3周。 为此有转换表。 我认为更大的问题来自于转换到格里高利日历。 不同的国家在不同的时间进行转换,并且由于转换的时间不同,失去的天数也不同。 如果假设今天是10月1日,明天是10月10日,则在这种情况下,转换将导致该特定国家损失9天。 另一个在稍后某个时间进行转换的国家可能损失11天、12天、13天等。 另一个大问题是尝试在特定日期确定季节。 由于不精确的日历,在赤道岁差的影响下,季节随着时间在日历年中的快速进展而进行。 今天,我们在北半球的7月份拥有夏天。 3000年前,如果我们使用朱利安日历作为标准,在这个日历月中可能会在冬季中间发生。 还要注意的是,古代世界使用了各种各样的古老日历系统。 太阳和月亮的品种都存在,并且直到大约2000年前(朱利安日历发明时)才进行了现实有效的标准化尝试。 人们经常试图将朱利安日期投射到更久远的历史中,但这些努力是不合时宜的。 由于记录的不一致性造成的不确定性,不可能确定特定事件发生在与朱利安日历相关联的特定日期上,除非采用相当大的误差范围的迂回方式。 对于发生在公元前第一千年之前的事件,这种误差可能是50或100年(在某些时期可能更多)。 我们根本没有记录来建立极端精确的时间线。 与现有记录相关的树轮顺序得出的碳约会已经帮助缩小了各个地区和时期的误差范围,但它们并不组成完全连接的记录,我们总是需要处理误差范围。

0
我用C#编写了一个HugeGreogorianDateTime类和两个时间跨度类来添加时间量。它基于UInt64,并使用秒作为最大分辨率,因此您可以获得相当广泛的年份范围。
它处理每4年发生一次的格雷戈里闰年,使用不同长度的月份和不存在年份0。我希望这是一个完整的格雷戈里日期时间类所需的全部内容。如果不是,请在我的git中留下评论。

https://github.com/DeepSeeBee/HugeGregorianDateTime


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接