知识大全 使用.NET Framework中新的日期时间类型

Posted 时间

篇首语:水往下流,人争上游。本文由小常识网(cha138.com)小编为大家整理,主要介绍了知识大全 使用.NET Framework中新的日期时间类型相关的知识,希望对你有一定的参考价值。

使用.NET Framework中新的日期时间类型  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!

概述

  写下本文缘于前几天博客园一位朋友发表了一篇 NET面试题的文章 其中一个关于DateTime的问题引起了大家激烈的争论 鉴于日期时间类型是大家开发中会频繁使用的一个中数据类型 这里我们有必要来对 NET Framework中的日期时间类型做一个深入的认识

  从 NET Framework 开始 就提供了DateTime类型来表示一个日期时间类型 它是一个结构类型 并且不可以为空 这在一定程度上给我们在往数据库中保存数据时带来了很大的麻烦 因为我们知道 在数据库中datatime类型是可以为Null的 为了解决这个问题 不得不经常使用DateTime MinValue来表示 但这并不是我们想要的 幸运的是到了 NET Framework 中 提供了可空类型 此时我们就可以使用Nullable<DateTime>来表示一个日期时间类型 它是可以为Null的 这给我们带来了极大的方便

  到了 NET Framework 中 又为我们提供了一个全新的日期时间类型DateTimeOffset 它通常以相对于格林威治时间(GMT Greenwich Mean Time)的日期和时间来表示 格林威治时间又被称为国际标准时间UTC(Universal Time Code) 除此之外 在 NET Framework中还为我们提供了TimeZone类用来表示时区 到了 NET Framework 中 对TimeZone类进一步增强 提供了TimeZoneInfo类来表示世界上的任何时区

  在本文中 我们将对以上日期时间类型 时区类进行详细的介绍

  DateTime和DateTimeOffset

  DateTime 值类型表示值范围在公元 年 月 日午夜 : : 到公元 年 月 日晚上 : : 之间的日期和时间 DateTimeOffset包含一个DateTime 值以及一个名为Offset属性 该属性用于确定当前 DateTimeOffset 实例的日期和时间与UTC之间的差值 我们先来看一下这段代码的输出

  static void Main(string[] args)  Console WriteLine(DateTime Now);  Console WriteLine(DateTimeOffset Now);

  输出结果为

  

  可以看到 DateTime输出了日期和时间 DateTimeOffset类型不仅输出了日期和时间 还给出当前时间与UTC之间的差值 接下来我们再看一段代码 如何手工构造一个DateTime和DateTimeOffset实例

  static void Main(string[] args)  DateTime dateA = new DateTime( );  DateTimeOffset dateB = new DateTimeOffset(     new TimeSpan( ));  Console WriteLine(dateA);  Console WriteLine(dateB);

  输出结果如下图所示

  

  转换DateTime为DateTimeOffset

  通过上面的两个例子 大家应该对DateTimeOffset有了一个基本的认识 DateTimeOffset提供了比DateTime更高程度的时区识别能力 接下来我们看如何在DateTime和DateTimeOffset之间进行转换 开始之前我们先了解一下DateTimeKind枚举 在DateTime中提供了一个名为Kind的属性 它用来指示DateTime对象是表示本地时间 国际标准时间(UTC) 还是既不指定为本地时间 也不指定为国际标准时间(UTC) DateTimeKind的定义如下

  public enum DateTimeKind  Unspecified   Utc   Local

  对于UTC 和本地DateTime值 得到的DateTimeOffset值的Offset属性准确反映UTC 或本地时区偏移量 如下面的代码将 UTC 时间转换为与之等效的DateTimeOffset值

  static void Main(string[] args)  DateTime dateA = new DateTime( );  DateTime dateB = DateTime SpecifyKind(dateA DateTimeKind Utc);  DateTimeOffset dateC = dateB;  Console WriteLine(dateB);  Console WriteLine(dateC);

  输出结果如下图所示

  

  再来写一个表示本地时间的转换 如下代码所示

  static void Main(string[] args)  DateTime dateA = new DateTime( );  DateTime dateB = DateTime SpecifyKind(dateA DateTimeKind Local);  DateTimeOffset dateC = dateB;  Console WriteLine(dateB);  Console WriteLine(dateC);

  输出结果如下图所示

  

  如果在转换时指定的时间是Unspecified 转换后产生的DateTimeOffset的值的偏移量将会为本地时区 如下代码所示

  static void Main(string[] args)  DateTime dateA = new DateTime( );  DateTime dateB = DateTime SpecifyKind(dateA DateTimeKind Unspecified);  DateTimeOffset dateC = dateB;  Console WriteLine(dateB);  Console WriteLine(dateC);

  输出结果如下图所示 可以看到它产生的输出是本地时区

  

  这一点其实从DateTimeOffset的一个参数为DateTime的构造函数中就能够看出来 它只判断DateTime是否为UTC 否则就取当前本地时区的偏移量

  public DateTimeOffset(DateTime dateTime)   TimeSpan offset;  if (dateTime Kind != DateTimeKind Utc)     // Local 和 Unspecified 都转换为Local    offset = TimeZone CurrentTimeZone GetUtcOffset(dateTime);    else     offset = new TimeSpan( );    m_offsetMinutes = ValidateOffset(offset);  m_dateTime = ValidateDate(dateTime offset);

  转换DateTimeOffset为DateTime

  在转换一个DateTimeOffset类型为DateTime类型时 可以使用如下几个属性

  DateTime属性 返回一个指示为Unspecified的DateTime值

  UtcDateTime属性 返回一个指示为UTC的DateTime值 如果偏移量不为 它会转换为UTC时间

  LocalDateTime属性 返回一个指示为Local的DateTime值

  这三个属性的在DateTimeOffset中的定义如下代码所示

  public DateTime DateTime   get     return ClockDateTime;  public DateTime UtcDateTime   get     return DateTime SpecifyKind(m_dateTime DateTimeKind Utc);  public DateTime LocalDateTime   get     return UtcDateTime ToLocalTime();  

   可以看到 在LocalDateTime属性中首先会获取UtcDateTime 然后调用ToLocalTime()将其转换为本地时间 我们现在来看一组测试代码

  static void Main(string[] args)  DateTimeOffset basic = new DateTimeOffset(       new TimeSpan( ));  DateTime dateA = basic DateTime;  DateTime dateB = basic LocalDateTime;  DateTime dateC = basic UtcDateTime;  Console WriteLine(basic);  Console WriteLine( );  Console WriteLine( Unspecified DateTime: + dateA);  Console WriteLine( Local DateTIme: + dateB);  Console WriteLine( UTC DateTime: + dateC);

  最后输出的结果如下图所示

  

  在DateTime和DateTimeOffset之间选择

  上面说了这么多关于DateTime和DateTimeOffset类型 如何在DateTime和DateTimeOffset之间进行选择呢?从前面的示例中大家已经看到了 DateTime只可以表示UTC或者本地时区的时间 或者不确定的时区 这给我们应用程序的移植带来了极大的麻烦 除非你指定它表示的是UTC 否则在移植应用程序时会受到诸多的限制 例如下面这段最简单的代码

  static void Main(string[] args)  DateTime date = DateTime Now;  Console WriteLine(date);

  如果DateTime表示本地时区 那么应用程序在本地时区内移植是不会有问题的 但是如果你的应用程序需要对不同的时区都支持

  建议在使用时尽量将DateTime的Kind属性设置为Utc 这一点尤其重要 否则就需要考虑使用DateTimeOffset类型

  与DateTime类型不同的是 DateTimeOffset它唯一的标识了一个明确的时间点 即时间值以及相对于UTC的偏移量 它并不依赖于某个特定的时区 在大多数情况下 应当考虑使用DateTimeOffset来代替DateTime类型 并且在SQL Server 中也已经提供了对于DateTimeOffset数据类型的支持 详细信息可以参考这篇文章《SQL Server 中的新日期数据类型》

  但是DateTimeOffset类型并不是完全用来代替DateTime类型 在应用程序只用到日期而不涉及时间 如出生日期 用DateTime类型是没有任何问题的

  时区支持

     在 NET Framework 之前 我们只能使用TimeZone来表示一个时区 但是Timezone功能很有限 它只能识别本地时区 可以在UTC和本地时间之间转换时间 而TimeZoneInfo 对TimeZone进行了很大的增强 它可以表示世界上的任意时区 看下面一段代码

  static void Main(string[] args)  TimeZone timeZoneA = TimeZone CurrentTimeZone;  Console WriteLine(timeZoneA StandardName);  TimeZoneInfo timeZoneB = TimeZoneInfo Local;  Console WriteLine(timeZoneB StandardName);  TimeZoneInfo timeZoneC = TimeZoneInfo Utc;  Console WriteLine(timeZoneC StandardName);

  输出结果如下图所示

   

  TimeZone提供的属性和方法非常有限 TimeZoneInfo在这方面就显的非常丰富 我们可以使用TimeZoneInfo在两个不同的时区之间转换时间 如下面的代码

  static void Main(string[] args)  DateTimeOffset chinaDate = DateTimeOffset Now;  DateTimeOffset easternDate = TimeZoneInfo ConvertTime(    chinaDate     TimeZoneInfo FindSystemTimeZoneById( Eastern Standard Time ));  Console WriteLine( Now: chinaDate);  Console WriteLine( Now in Eastern: easternDate);

  输出结果如下图所示

   

     这里使用FindSystemTimeZoneById方法来根据ID来获取时区 在推出TimeZoneInfo之后 在以后的开发中完全可以放弃TimeZone类了 TimeZoneInfo已经完全包含了它

  总结

cha138/Article/program/net/201311/13894

相关参考

知识大全 使用.NET Framework中新的日期时间类型[2]

使用.NETFramework中新的日期时间类型[2]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 使用.NET Framework中新的日期时间类型[4]

使用.NETFramework中新的日期时间类型[4]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 使用.NET Framework中新的日期时间类型[3]

使用.NETFramework中新的日期时间类型[3]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 使用.NET Framework中新的日期时间类型[5]

使用.NETFramework中新的日期时间类型[5]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 使用.NET Framework中新的日期时间类型[6]

使用.NETFramework中新的日期时间类型[6]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 使用.NET Framework中新的日期时间类型[7]

使用.NETFramework中新的日期时间类型[7]  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧

知识大全 浏览.NET Framework 2.0 类型库中新增的常用功能

浏览.NETFramework2.0类型库中新增的常用功能  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一

知识大全 PHP5程序中新增加日期(date)函数的常量

PHP5程序中新增加日期(date)函数的常量  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  P

知识大全 如何建立一个VB.NET日期/时间值

如何建立一个VB.NET日期/时间值  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  组合一个日期

知识大全 .NET中的日期与时间的解决方法

.NET中的日期与时间的解决方法  以下文字资料是由(全榜网网www.cha138.com)小编为大家搜集整理后发布的内容,让我们赶快一起来看一下吧!  在ASPNet一