|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
刚刚打开这篇专题,猛然见到HAL9000发表的《对于大型公司项目平台选择j2ee的几层认识》系列,深受启发。概述
写下本文缘于头几天博客园一名伴侣宣布了一篇.NET口试题的文章,个中一个关于DateTime的成绩引发了人人剧烈的争辩,鉴于日期工夫范例是人人开辟中会频仍利用的一其中数据范例,这里我们有需要来对.NETFramework中的日期工夫范例做一个深切的熟悉。
从.NETFramework1.0入手下手,就供应了DateTime范例来暗示一个日期工夫范例,它是一个布局范例,而且不成觉得空,这在必定水平上给我们在往数据库中保留数据时带来了很年夜的贫苦,由于我们晓得,在数据库中datatime范例是能够为Null的,为懂得决这个成绩,不能不常常利用DateTime.MinValue来暗示,但这并非我们想要的。侥幸的是到了.NETFramework2.0中,供应了可空范例,此时我们就能够利用Nullable<DateTime>来暗示一个日期工夫范例,它是能够为Null的,这给我们带来了极年夜的便利。
到了.NETFramework3.5中,又为我们供应了一个全新的日期工夫范例DateTimeOffset,它一般以相对格林威治工夫(GMT,GreenwichMeanTime)的日期和工夫来暗示,格林威治工夫又被称为国际尺度工夫UTC(UniversalTimeCode)。除此以外,在.NETFramework中还为我们供应了TimeZone类用来暗示时区,到了.NETFramework3.5中,对TimeZone类进一步加强,供应了TimeZoneInfo类来暗示天下上的任什么时候区。
在本文中,我们将对以上日期工夫范例、时区类举行具体的先容。
DateTime和DateTimeOffset
DateTime值范例暗示值局限在公元0001年1月1日半夜12:00:00到公元9999年12月31日早晨11:59:59之间的日期和工夫;DateTimeOffset包括一个DateTime值和一个名为Offset属性,该属性用于断定以后DateTimeOffset实例的日期和工夫与UTC之间的差值,我们先来看一下这段代码的输入:- 1:staticvoidMain(string[]args)
复制代码- 3:Console.WriteLine(DateTime.Now);
复制代码- 4:Console.WriteLine(DateTimeOffset.Now);
复制代码 输入了局为:
<br>
能够看到,DateTime输入了日期和工夫,DateTimeOffset范例不但输入了日期和工夫,还给出以后工夫与UTC之间的差值。接上去我们再看一段代码,怎样手工机关一个DateTime和DateTimeOffset实例:- 1:staticvoidMain(string[]args)
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,
复制代码 输入了局以下图所示:
<br>
转换DateTime为DateTimeOffset
经由过程下面的两个例子,人人应当对DateTimeOffset有了一个基础的熟悉,DateTimeOffset供应了比DateTime更高水平的时区辨认才能,接上去我们看怎样在DateTime和DateTimeOffset之间举行转换,入手下手之前我们先懂得一下DateTimeKind列举,在DateTime中供应了一个名为Kind的属性,它用来唆使DateTime对象是暗示当地工夫、国际尺度工夫(UTC),仍是既不指定为当地工夫,也不指定为国际尺度工夫(UTC),DateTimeKind的界说以下:关于UTC和当地DateTime值,失掉的DateTimeOffset值的Offset属性正确反应UTC或当地时区偏移量,以下面的代码将UTC工夫转换为与之等效的DateTimeOffset值:- 1:staticvoidMain(string[]args)
复制代码- 3:Console.WriteLine(DateTime.Now);2
复制代码- 3:Console.WriteLine(DateTime.Now);3
复制代码- 3:Console.WriteLine(DateTime.Now);4
复制代码- 3:Console.WriteLine(DateTime.Now);5
复制代码- 3:Console.WriteLine(DateTime.Now);6
复制代码- 3:Console.WriteLine(DateTime.Now);8
复制代码- 3:Console.WriteLine(DateTime.Now);9
复制代码 输入了局以下图所示:
<br>
再来写一个暗示当地工夫的转换,以下代码所示:- 1:staticvoidMain(string[]args)
复制代码- 4:Console.WriteLine(DateTimeOffset.Now);2
复制代码- 4:Console.WriteLine(DateTimeOffset.Now);3
复制代码- 3:Console.WriteLine(DateTime.Now);4
复制代码- 3:Console.WriteLine(DateTime.Now);5
复制代码- 3:Console.WriteLine(DateTime.Now);6
复制代码- 3:Console.WriteLine(DateTime.Now);8
复制代码- 3:Console.WriteLine(DateTime.Now);9
复制代码 输入了局以下图所示:
<br>
假如在转换时指定的工夫是Unspecified,转换后发生的DateTimeOffset的值的偏移量将会为当地时区,以下代码所示:- 1:staticvoidMain(string[]args)
复制代码- 4:Console.WriteLine(DateTimeOffset.Now);2
复制代码- 3:Console.WriteLine(DateTime.Now);4
复制代码- 3:Console.WriteLine(DateTime.Now);5
复制代码- 3:Console.WriteLine(DateTime.Now);6
复制代码- 3:Console.WriteLine(DateTime.Now);8
复制代码- 3:Console.WriteLine(DateTime.Now);9
复制代码 输入了局以下图所示,能够看到它发生的输入是当地时区:
<br>
这一点实在从DateTimeOffset的一个参数为DateTime的机关函数中就可以够看出来,它只判别DateTime是不是为UTC,不然就取以后当地时区的偏移量:- 1:staticvoidMain(string[]args)0
复制代码- 1:staticvoidMain(string[]args)1
复制代码- 1:staticvoidMain(string[]args)2
复制代码- 1:staticvoidMain(string[]args)3
复制代码- 1:staticvoidMain(string[]args)4
复制代码- 1:staticvoidMain(string[]args)6
复制代码- 1:staticvoidMain(string[]args)7
复制代码- 1:staticvoidMain(string[]args)9
复制代码 转换DateTimeOffset为DateTime
在转换一个DateTimeOffset范例为DateTime范例时,可使用以下几个属性:
DateTime属性:前往一个唆使为Unspecified的DateTime值;
UtcDateTime属性:前往一个唆使为UTC的DateTime值,假如偏移量不为0,它会转换为UTC工夫;
LocalDateTime属性:前往一个唆使为Local的DateTime值。
这三个属性的在DateTimeOffset中的界说以下代码所示:- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);0
复制代码- 3:Console.WriteLine(DateTime.Now);9
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);2
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);3
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);4
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);5
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);6
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);7
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);8
复制代码 能够看到,在LocalDateTime属性中起首会猎取UtcDateTime,然后挪用ToLocalTime()将其转换为当地工夫。我们如今来看一组测试代码:- 1:staticvoidMain(string[]args)
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,1
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,2
复制代码- 3:Console.WriteLine(DateTime.Now);4
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,4
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,5
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,6
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,7
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,8
复制代码- 4:DateTimeOffsetdateB=newDateTimeOffset(2008,8,26,23,1,48,9
复制代码 最初输入的了局以下图所示:
<br>
在DateTime和DateTimeOffset之间选择
下面说了这么多关于DateTime和DateTimeOffset范例,怎样在DateTime和DateTimeOffset之间举行选择呢?夙昔面的示例中人人已看到了,DateTime只能够暗示UTC大概当地时区的工夫,大概不断定的时区,这给我们使用程序的移植带来了极年夜的贫苦,除非你指定它暗示的是UTC,不然在移植使用程序时会遭到诸多的限定,比方上面这段最复杂的代码:- 1:staticvoidMain(string[]args)
复制代码 假如DateTime暗示当地时区,那末使用程序在当地时区内移植是不会有成绩的。可是假如你的使用程序必要对分歧的时区都撑持,倡议在利用时只管将DateTime的Kind属性设置为Utc,这一点特别主要,不然就必要思索利用DateTimeOffset范例。
与DateTime范例分歧的是,DateTimeOffset它独一的标识了一个明白的工夫点,立即间值和相对UTC的偏移量,它其实不依附于某个特定的时区,在年夜多半情形下,应该思索利用DateTimeOffset来取代DateTime范例。而且在SQLServer2008中也已供应了关于DateTimeOffset数据范例的撑持,具体信息能够参考这篇文章《SQLServer2008中的新日期数据范例》。
可是DateTimeOffset范例并非完整用来取代DateTime范例,在使用程序只用到日期而不触及工夫,如出身日期,用DateTime范例是没有任何成绩的。
时区撑持
在.NETFramework3.5之前,我们只能利用TimeZone来暗示一个时区,可是Timezone功效很无限,它只能辨认当地时区,能够在UTC和当地工夫之间转换工夫;而TimeZoneInfo对TimeZone举行了很年夜的加强,它能够暗示天下上的恣意时区。看上面一段代码:- 1:staticvoidMain(string[]args)
复制代码- 3:Console.WriteLine(DateTime.Now);4
复制代码- 3:DateTimedateA=newDateTime(2008,8,26,23,1,48);2
复制代码 输入了局以下图所示:
<br>
TimeZone供应的属性和办法十分无限,TimeZoneInfo在这方面就显的十分丰厚,我们可使用TimeZoneInfo在两个分歧的时区之间转换工夫,以下面的代码:- 1:staticvoidMain(string[]args)
复制代码- 3:Console.WriteLine(DateTime.Now);6
复制代码- 3:Console.WriteLine(DateTime.Now);9
复制代码 输入了局以下图所示:
<br>
这里利用FindSystemTimeZoneById办法来依据ID来猎取时区。在推出TimeZoneInfo以后,在今后的开辟中完整能够保持TimeZone类了,TimeZoneInfo已完整包括了它。
总结
本文先容了.NETFramework中关于日期工夫范例的撑持,但愿对人人有所匡助。
本文来自:http://www.dotneteye.cn/post/2008/08/30/using-NET-Frameworke-new-datetime-data-type.aspx
其实net网页编程之所以在曾经独步天下,就是因为他的跨平台、安全性,这两方面,效率可不是net网页编程的强项,反而是他最短的一块挡板,虽然net总是用理论证明比.NET快。 |
|