在 DateTime、DateTimeOffset 和 TimeZoneInfo 之间进行选择

使用日期和时间信息的 .NET Framework 应用程序千差万别,它们可以通过多种方式使用这些信息。 日期和时间信息较常见的用法包括以下一种或多种:
  • 仅反映日期,时间信息并不重要。

  • 仅反映时间,日期信息并不重要。

  • 反映不依赖于特定时间和地点的抽象日期和时间(例如,大部分国际连锁店都在每个工作日的上午 9:00 开始营业)。

  • 从 .NET Framework 之外的源中检索日期和时间信息,这种源中的日期和时间信息通常以简单的数据类型进行存储。

  • 唯一、明确地标识单个时间点。 有些应用程序只要求主机系统上的日期和时间明确,而其他一些应用程序则要求跨系统的日期和时间都必须明确(也就是说,在一个系统上序列化的日期可以进行有意义的反序列化,并用在世界上其他任何地方的系统上)。

  • 保留多个相关时间(如请求者的本地时间和服务器接收 Web 请求的时间)。

  • 执行日期和时间算法,可能产生能够唯一、明确标识单个时间点的结果。

DateTime 值用于定义特定的日期和时间。 从 .NET Framework 的 2.0 版本开始,就包括了一个 Kind 属性,该属性可提供有关日期和时间所属时区的有限信息。 Kind 属性返回的 DateTimeKind 值指示 DateTime 值是表示本地时间 ( DateTimeKindLocal)、协调世界时 (UTC) ( DateTimeKindUtc),还是表示未指定的时间 ( DateTimeKindUnspecified)。

DateTime 结构适用于执行下列操作的应用程序:

  • 只使用日期。

  • 只使用时间。

  • 使用抽象日期和时间。

  • 从 .NET Framework 之外的源(如 SQL 数据库)中检索日期和时间信息。 这些源通常以与 DateTime 结构兼容的简单格式存储日期和时间信息。

  • 执行日期和时间算法,但不关心常规结果。 例如,在向特定日期和时间添加六个月的加法运算中,结果是否按夏时制进行调整通常并不重要。

除非是表示 UTC 的特定 DateTime 值,否则,该日期和时间值在可迁移性方面通常是不明确或是有限的。 例如,如果 DateTime 值表示本地时间,那么它在该本地时区内是可迁移的(也就是说,如果在同一时区中的不同系统上反序列化该值,该值仍可以明确标识单个时间点)。 在该本地时区之外,该 DateTime 值可有多种解释。 如果该值的 Kind 属性为 DateTimeKindUnspecified,那么其可迁移性会更低:现在它在同一时区内不明确,那么它在首次被序列化的同一系统上,可能更不明确。 只有表示 UTC 的 DateTime 值才可以明确标识单个时间点,且与它在哪个系统或是哪个时区中使用无关。

重要说明重要事项

在保存或共享 DateTime 数据时,应使用 UTC,而且应将 DateTime 值的 Kind 属性设置为 DateTimeKindUtc

 

 

DateTimeOffset 结构表示日期和时间值以及指示该值与 UTC 之差的偏移量。 因此,该值始终可以明确标识单个时间点。

虽然 DateTimeOffset 类型包括 DateTime 类型的大部分功能,但其目的并不是为了在应用程序开发中替代 DateTime 类型。 而是适用于执行下列操作的应用程序:

  • 唯一、明确地标识单个时间点。 DateTimeOffset 类型可用于明确定义“现在”的含义、记录事务次数、记录系统或应用程序事件的次数,以及记录文件创建和修改的次数。

  • 执行常规的日期和时间算法。

  • 保留多个相关时间,只要这些时间作为两个单独的值或作为一个结构的两个成员存储即可。

说明说明

DateTimeOffset 值的这些用法要比 DateTime 值的用法更为常见。 因此,应考虑将 DateTimeOffset 作为应用程序开发的默认日期和时间类型。

虽然 DateTimeOffset 值不依赖于特定的时区,但它可以来自任何不同的时区。 为了说明这一点,下面的示例列出了许多 DateTimeOffset 值(包括本地太平洋标准时间)所属的时区。

 

 

TimeZoneInfo 类表示世界上的任意时区,并能将一个时区中的任何日期和时间转换为另一个时区中的等效日期和时间。 通过 TimeZoneInfo 类,可以使用日期和时间,以便任何日期和时间值都可以明确标识单个时间点。 TimeZoneInfo 类还是可扩展的。 虽然它依赖于在注册表中定义的、为 Windows 系统提供的时区信息,但它支持创建自定义时区。 它还支持时区信息的序列化和反序列化。

在有些情况下,完全利用 TimeZoneInfo 类可能需要进一步的开发工作。 首先,日期和时间值与其所属的时区没有紧密关联。 因此,除非您的应用程序提供将日期和时间与其相关联的时区链接在一起的某种机制,否则特定的日期和时间值很容易解除与其时区的关联。 (链接此信息的一种方法是定义同时包含日期和时间值及其相关联的时区对象的类或结构。)其次,Windows XP 及 Windows 的早期版本没有提供对历史时区信息的实时支持,而 Windows Vista 只能提供有限的支持。 对于设计用于处理历史日期和时间的应用程序,必须广泛使用自定义时区。

只有在实例化日期和时间对象时已知该日期和时间值所属时区的情况下,才可以利用 .NET Framework 中提供的时区支持。 但通常情况并非如此,特别是在 Web 或网络应用程序中。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值