处理时间 / 日期值的新最佳实践

阅读数:58 2007 年 6 月 22 日

话题:.NET语言 & 开发架构

包括各个.NET 语言在内的各种程序设计语言中的一个常见问题就是,它们都没有提供足够优雅的时区支持方法。为了能够正确处理时区信息,程序要么需要将时区信息单独保存起来,要么则要把时间转化成统一的标准形式保存。这样繁杂的工作让人厌倦,以至于很多开发者在开发时干脆将时区信息撇在一旁,不予理会。

不过微软公司则试图通过引入两个新的类型来改变这种状况。第一个类型是TimeZoneInfo。与其前辈 TimeZone 类型相比,TimeZoneInfo 在时区方面提供了更好的支持,例如它能够枚举出储存于操作系统中的各个时区信息。

第二个叫做DateTimeOffset的类型则更为重要,在大多数情况下该类型将会作为传统 DateTime 类型的替代品使用。与 DateTime 只能保存本地和 UTC 时间不同的是,DateTimeOffset 类型可以表示任何时区中的时间——只要指定该时区相对于 UTC 的偏移量即可。

按照 Anthony Moore 的说法,在大多数时间相关的场景中,DateTimeOffset 都应该作为默认的表示方法。不过以下情况例外:

  • DateTime 可以用于对时间的绝对值不敏感的场合。例如商店的营业时间。
  • DateTime 可以用于无关时区的一些互操作场景中。例如 OLE 自动化、数据库、当前正使用 DateTime 的.NET API 等。
  • DateTime 可以用于表示一个不包含时间的“纯”日期。例如某人的生日。
  • TimeSpan 可以用于表示时间的跨度——与日期无关。

据 Justin Van Patten 所说,Base Class Library(BCL)将在未来全面使用 DateTimeOffset——虽然并不是所有人都完全赞同这个决定。例如有些人希望引入 IDateTime 来代替原本的 DateTime 签名,而另一些人则希望让 DateTime 对象中只存储 UTC 时间。

至于这两个新的时间日期类将如何配合.NET 框架(特别是 ADO.NET 和 LINQ)的其它部分,还有待时间的验证。

查看英文原文:New Best Practices for Working with Date/Time Values