Noda Time是用于.NET的高级日期/时间库,其最新版本适用于Windows 8、Windows Phone 7和Windows Phone 8。该版本还提供了NuGet包和全面的用户指南。
Noda Time将类型系统分为两类,即本地类型与全球类型。
本地类型不会绑定到任何时区,但可能会包含一个日历组件。这与DateTimeKind被设置Unspecified的DateTime类相似。此外,Noda Time还支持只有时间或只有日期的值。
全球类型基于Instant的概念。一个Instant是通用时间系统中的某个特定时刻。为了与其他系统兼容,它以时间片(tick)为单位,从世 界标准时间1970年1月1日(Unix纪元)开始计算,这里每毫秒被划分为1万个时间片,从而能够支持非常高的精度。但应该指出的是,某些科学仪器能够 以小到10-18秒的时间片来测量时间。
诸如ZonedDateTime等类会将Instant与时区信息结合起来。与DateTimeOffset不同,ZonedDateTime包含了需要显示给用户的实际时区信息。
下面这幅来自其文档的转换图展现了这些核心类型是如何关联的:
与BCL相比,Noda Time的另一个优势是对历史日期的支持。BCL的DateTime类表示的最小值是公元元年。Noda Time则支持表示到大约公元前27000年,可以用于应用中对古埃及和中国的年表进行的比较。
Noda Time同时支持Windows和Olson时区数据库。由于各国政府经常会修改时区相关的法律,因此Noda Time允许开发者加入较新版本的数据库。
在Noda Time中,Period和Duration有着不同的含义。Duration表示一段固定长度的时间,可用时间片进行计量。而Period则是抽象的概 念,例如“一个月”或“两周”。“由Period表示的时间流逝的总量并不是固定的:始于1月1日的‘一个月’,实际上比从2月1日开始的‘一个月’要 长,因为2月总是比1月短。”
在面向Java的Joda Time的基础上,Noda Time是为了修正.NET日期/时间类中现存的许多问题而设计的。例如,它允许开发者直接表示日期而无需时间组件,从而避免不必要的时区转化将“12月10日零点”意外地变成“12月9日晚11点”这样的问题。
Noda Time提供了IClock接口以支持测试。它通过SystemClock和FakeClock实现。初始化之后就可以手动递增FakeClock,或为它设置固定步长的自动增量。
Noda Time基于Apache许可提供。