Jon Skeet 谈 Noda Time 1.0

  • Abel Avram
  • 姚琪琳

2012 年 11 月 21 日

话题:.NET语言 & 开发

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)关注我们,并与我们的编辑和其他读者朋友交流。

.NET语言 & 开发