Jon Skeet,Google 软件工程师,微软 C# MVP,最近发布了 Noda Time 1.0,这是流行的 Java 日期 / 时间库 Joda Time 的.NET 版本。
Noda Time 旨在修复.NET 日期/ 时间库中的缺陷,并降低使用复杂度。Noda Time 采用了一些关键的概念:Instant—从Unix 纪元开始计算的时刻;Partial—表示部分日期/ 时间;Interval—从一个毫秒时刻到另一个毫秒时刻的时间间隔;Duration—以毫秒为单位的时间间隔所持续的时间;Period—用字段表示的一段时间;Chronology—一个可插接的日历系统;Time Zone 根据 tz 数据库进行更新。
虽然将 Joda Time 移植到.NET 用了 3 年时间并且还有很多工作没有完成,但鉴于“在提供干净的 API(在强调该领域‘固有的’复杂性的同时降低了‘附带的’复杂性)方面,我们已经明显领先于我所见过的其他日期 / 时间 API”,Skeet 仍然对这个结果感到满意。
InfoQ 联系到了 Skeet,让他谈谈更多关于 Noda Time 的内容以及未来的计划。
InfoQ:Noda Time 1.0 提供了哪些.NET 4.5 没有的特性?
JS:基本上,BCL 中的类型十分有限——主要有两个类型(DateTime 和 DateTimeOffset)来表达你想表达的一个完整范围内的概念。Noda Time 具有更多的类型,可以帮助开发者将精力集中于他们真正操作的数据类型。我们故意将它涉及为受限的 API,可以防止你执行没有意义的操作。
关于我为什么不喜欢 BCL 中的时间 / 日期类型,可以看看我关于 DateTime 的博文。
从根本上,我认为 API 在暴露功能时应该考虑以下四个目标:
- 强迫用户做出某些决定(而不是隐藏该领域中重要的部分)
- 当他们做出决定后,可以用干净的代码来表达这个决定,并在后台处理所有工作以实现这个决定
- 尽可能地仅表达有意义的操作
- 鼓励编写可测的代码
除了常规的日期时间 API,Noda Time 还提供了 TZDB/zoneinfo/Olson/IANA 时区信息的实现。
InfoQ:关于它的未来,你有什么计划?
JS:当然,这部分上取决于我们的用户。现在仍然有一些未完成的部分——我们希望能有更多的文本处理(起初可以先解析 ZonedDateTime 和 OffsetDateTime)和 PCL 支持。不同形式的序列化问题也不容回避——我们已经实验性地支持了一些 Json.NET(不在主程序集内),我还希望当 v1.0 中的主要概念全部正确的时候,我们可以增加对 XML 和二进制序列化的支持。
InfoQ:Noda Time 能在任何.NET 版本下工作吗?Mono 行吗?
JS:目前我们针对的是.NET 3.5+,并且仅限于桌面版。我们希望支持便携式类库(PCL,Protable Class Libraries),但工作量太大,对那些需要框架支持但 PCL 却不支持的特性,我们只能忍痛割爱。
代码在设计上是支持 Mono 的,并且我们尽可能地在 Mono 上进行了测试。但在 Mono 的稳定发布版本上,我们遇到了一些问题,大多数是关于区域和 TimeZoneInfo 的。但愿 Mono 3.0 能至少解决其中的一些问题。对于普通的计算方面的事宜,以及在使用 TZDB 的时候,Mono 都能工作得很好。当然,这些目标永远是不断变化的——我们会把更多的精力放在记录对于不同的操作系统和版本的组合,已经发现了哪些具体的问题。
查看英文原文: Jon Skeet on Noda Time 1.0
给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors@cn.infoq.com 。也欢迎大家通过新浪微博( @InfoQ )或者腾讯微博( @InfoQ )关注我们,并与我们的编辑和其他读者朋友交流。
评论