可移植类库(Portable Class Library)已支持Noda Time

Noda Time是用于.NET的高级日期/时间库,其最新版本适用于Windows 8、Windows Phone 7和Windows Phone 8。该版本还提供了NuGet包和全面的用户指南。

\u0026#xD;\n

Noda Time将类型系统分为两类,即本地类型与全球类型。

\u0026#xD;\n

本地类型不会绑定到任何时区,但可能会包含一个日历组件。这与DateTimeKind被设置Unspecified的DateTime类相似。此外,Noda Time还支持只有时间或只有日期的值。

\u0026#xD;\n

全球类型基于Instant的概念。一个Instant是通用时间系统中的某个特定时刻。为了与其他系统兼容,它以时间片(tick)为单位,从世界标准时间1970年1月1日(Unix纪元)开始计算,这里每毫秒被划分为1万个时间片,从而能够支持非常高的精度。但应该指出的是,某些科学仪器能够以小到10-18秒的时间片来测量时间。

\u0026#xD;\n

诸如ZonedDateTime等类会将Instant与时区信息结合起来。与DateTimeOffset不同,ZonedDateTime包含了需要显示给用户的实际时区信息。

\u0026#xD;\n

下面这幅来自其文档的转换图展现了这些核心类型是如何关联的:

\u0026#xD;\n

\u0026#xD;\n

与BCL相比,Noda Time的另一个优势是对历史日期的支持。BCL的DateTime类表示的最小值是公元元年。Noda Time则支持表示到大约公元前27000年,可以用于应用中对古埃及和中国的年表进行的比较。

\u0026#xD;\n

Noda Time同时支持Windows和Olson时区数据库。由于各国政府经常会修改时区相关的法律,因此Noda Time允许开发者加入较新版本的数据库。

\u0026#xD;\n

在Noda Time中,Period和Duration有着不同的含义。Duration表示一段固定长度的时间,可用时间片进行计量。而Period则是抽象的概念,例如“一个月”或“两周”。“由Period表示的时间流逝的总量并不是固定的:始于1月1日的‘一个月’,实际上比从2月1日开始的‘一个月’要长,因为2月总是比1月短。”

\u0026#xD;\n

在面向Java的Joda Time的基础上,Noda Time是为了修正.NET日期/时间类中现存的许多问题而设计的。例如,它允许开发者直接表示日期而无需时间组件,从而避免不必要的时区转化将“12月10日零点”意外地变成“12月9日晚11点”这样的问题。

\u0026#xD;\n

Noda Time提供了IClock接口以支持测试。它通过SystemClock和FakeClock实现。初始化之后就可以手动递增FakeClock,或为它设置固定步长的自动增量。

\u0026#xD;\n

Noda Time基于Apache许可提供。

\u0026#xD;\n

查看英文原文:Portable Class Library Support for Noda Time

\u0026#xD;\n

感谢臧秀涛对本文的审校。

\u0026#xD;\n

给InfoQ中文站投稿或者参与内容翻译工作,请邮件至[email protected]。也欢迎大家通过新浪微博(@InfoQ)或者腾讯微博(@InfoQ)关注我们,并与我们的编辑和其他读者朋友交流。

你可能感兴趣的:(可移植类库(Portable Class Library)已支持Noda Time)