一.时区的概念
首先来了解时区的概念。为了解决世界不同各地在时间上的差异,人们定义了时区,时区是地球上的区域使用同一个时间定义。人们将时区分为24个,它们是中时区(零时区)、东1-12区,西1-12区。每个时区横跨经度15度,时间正好是1小时。其中中时区就是格林尼治标准时间。以这个时间为基准,东加西减。我们中国虽然跨越了五个时区,但是统一采用北京时间,也就是东八区。这面有几个换算时差的列子。
格林尼治时间 5月31日 0:00:00 则北京时间是 5月31日 8:00:00
北京时间: 5月31日 8:00:00 则格林尼治时间 是 5月31日 0:00:00
北京时间: 5月31日 8:00:00 则东京时间(东九区):5月31日 9:00:00 (东加西减)
北京时间 5月31日 8:00:00 则纽约时间(西五区):先转换成格林尼治时间 5月31日 0:00:00 再在这个时间的基础上减去4个小时得出纽约时间:4月30日 20:00:00
二:.NET的DateTime关于时区的探讨
DateTime有一个Kind属性,该属性的类型为DateTimeKind的枚举。DateTimeKind定义如下,它具有三个枚举值:Unspecified、Utc和Local。后两个分别表示UTC(格林威治时间)和本地时间。Unspecified顾名思义,就是尚未指定具体类型,这是默认值。
1 [Serializable]
2 [ComVisible(true)]
3 public enum DateTimeKind
4 {
5 // 摘要:
6 // The time represented is not specified as either local time or Coordinated
7 // Universal Time (UTC).
8 Unspecified = 0,
9 //
10 // 摘要:
11 // The time represented is UTC.
12 Utc = 1,
13 //
14 // 摘要:
15 // The time represented is local time.
16 Local = 2,
17 }
而且该属性是只读属性,我们能通过构造函数或者DateTime的静态函数SpecifyKind。该方法不会真正去修改一个现有DateTime对象的Kind属性,而是会重新创建一个新的DateTime对象。方法返回的对象具有和指定时间相同的基本属性(年、月、日、时、分、秒和毫秒),该DateTime对象具有你指定的DateTimeKind值。
public
static
DateTime SpecifyKind(DateTime value, DateTimeKind kind);
|
三.几个常用DateTime对象的DateTimeKind
处理直接通过构造函数构建DateTime对象之外,我们还经常用到DateTime的几个静态只读属性去获取一些特殊的时间,比如N