野田时间与远古时代

时间:2019-01-26 00:28:18

标签: c# nodatime

我正在使用WikiPedia中的某些值,这些值在某些情况下已存在数百万年了(就像月亮的形成一样,WikiData报告说是这样形成的:“-4527000000-01-01T00:00:00Z”。其他情况下,我只是看可能是10000 BC等的年份,仍然表示为“ -10000-01-01T00:00:00Z”。

据我所知测试NodaTime并阅读文档,不支持这些古老的年份(或者我忽略了某些东西)。例如,这失败了:

OffsetDateTime defaultValue = new OffsetDateTime(new LocalDateTime(77, 1, 1, 0, 0), Offset.Zero);
var pattern = OffsetDateTimePattern.Create("yyyy-MM-ddTHH:mm:ss'Z'", CultureInfo.InvariantCulture, defaultValue);
string P = "-1000-01-25T20:34:25Z";
var result = pattern.Parse(P);

NodaTime.Text.UnparsableValueException: The value string includes a negative value where only a non-negative one is allowed. Value being parsed: '^-1000-01-25T20:34:25Z'. (^ indicates error position.)
   at NodaTime.Text.ParseResult`1.GetValueOrThrow() in C:\Users\jon\Test\Projects\nodatime\build\releasebuild\src\NodaTime\Text\ParseResult.cs:line 81
   at TryNodaTime.Program.Main(String[] args

使用此字符串唱歌可以正常工作:字符串P =“ 1000-01-25T20:34:25Z”;

我希望我只是忽略了一些明显的东西,以处理非常大的旧日期/年。其他示例包括旧城市btw,其确切日期早于0年。

非常感谢您指导如何处理这些问题。

编辑:找到了这个示例,要求我首先手动检测年份,然后如果它为负数,则使用LocalDate,但是,它不能解决较大的问题,因为它在-9999以下失败:

LocalDate BCDATE = new LocalDate(Era.BeforeCommon, -15000, 10, 1);
Console.WriteLine($"BC: {BCDATE}");

1 个答案:

答案 0 :(得分:3)

Noda Time不支持远古时代的价值。

支持的值范围为in the user guide

  

Noda时间只能表示有限范围内的值。这是出于务实的原因:尽管有可能尝试对大爆炸的某些时刻进行建模,直到某些预期的“时间终结”为止,但这将对99.99%的程序员的经验造成巨大的损失。只是需要在一个相当现代的时代(但不是遥不可及的未来)中处理日期和时间。

     

Noda Time 1.x版本支持的年份介于-27000和+32000之间(在公历),但是在极端情况下存在重大问题。 Noda Time 2.0的范围更小,行为更清晰。

     

...

     

此外,所有日历都被限制为四位数字格式,即使在年份表示中也是如此,这避免了必须解析5位数字的年份。这导致公历从公元前9999年到9999年(包括首尾)或-9998至9999年(绝对)年。其他日历的范围取决于此以及自然限制(例如,不多产)。

恐怕我认为最好不要在此用例中完全使用Noda Time,而不是尝试解决它-除非您可以有效地逐字逐句地报告遥远的日期并这样做与他们没有其他合作。

抱歉,这是尝试支持 all 用例会对更常见的用例造成伤害的一种情况:(