.NET 的瑞典日历中没有 1712 年 2 月 30 日吗?

No February 30th, 1712 in .NET's Swedish calendar?

this wonderful talk about how weirdness in real life data reflects on computer data types, Jon Skeet tells that February had 30 days in Sweden in 1712 in a weird attempt to manage leap years while adapting to the Gregorian calendar (more on this in Wikipedia)。出于纯粹的好奇,我打开了 LINQPad 并写下了以下内容:

var date=new DateTime(1712,2,29,CultureInfo.GetCultureInfo("sv-SE").Calendar);
date.AddDays(1).Dump();

我期待看到令人惊叹的 2 月 30 日,但这只会让 3 月 1 日变得无聊。仔细考虑一下,.NET DateTime class 可能不支持 month=2 和 day=30 的实例......但是无论如何,我想知道:doesn't the .NET's Swedish calendar implement 1712 年 2 月 30 日是什么日期?还是确实如此,但我的测试不正确?

基本上 .NET 日历代码不支持公历和儒略历之间的转换...即使支持,我也不会真的期望它支持瑞典情况的古怪情况,瑞典情况不支持关注其中 个。请记住,即使在 "normal" 个案例中,切换发生在不同文化的不同时间。历史日历也有很多其他奇怪之处 - 请参阅 Noda Time trivia page 了解一些示例。我特别喜欢英国日历在 1735 年左右做一些奇怪的事情。

切换非常难以建模,因为您最终会遇到导致各种代码爆炸的间隙。你要么得到一个非常笨拙的 API ,它适用于所有情况但在所有情况下都很难使用,要么得到一个更简单的 API ,它适用于 99.999% 的软件需求,但不处理历史极端情况。一些 API(例如 Joda Time)以一种相当简单的方式对转换进行建模,但最终会导致一些 API 行为异常。

对于 Noda Time 我决定根本不尝试对此进行建模 - 如果您处于关心 19 世纪之前的日期的情况下,您很可能处于这种专家情况无论如何,你将要实现很多你自己的东西。