DataSetDateTime.Local: 对于DateTimeKind.Local时间,不做任何转换;对于DateTimeKind.Utc时间,基于时区偏移量进行转换,并将Kind属性转换成DateTimeKind.Local;对于DateTimeKind.Unspecified,直接将Kind属性转换成DateTimeKind.Local,时间值(年、月、日、时、分、秒、毫秒等)保持不变;
DataSetDateTime.Utc: 对于DateTimeKind.Utc时间,不做任何转换;对于DateTimeKind.Local时间,基于时区偏移量进行转换,并将Kind属性转换成DateTimeKind.Utc;对于DateTimeKind.Unspecified,直接将Kind属性转换成DateTimeKind.Utc,时间值(年、月、日、时、分、秒、毫秒等)保持不变;
DataSetDateTime.Unspecified|UnspecifiedLocal:对于任何DateTimeKind类型的时间,直接将Kind属性转换成DateTimeKind.Unspecified,时间值(年、月、日、时、分、秒、毫秒等)保持不变。
然后,我写了下面三个辅助的方法:CreateContact通过传入的表示生日的DateTime创建一个ContractDataSet,DisplayBirthday分别将上诉四个字段的时间和Kind打印出来。
我们的实例程序是这样的:分别创建基于三种不同的DateTimeKind的DateTime对象,并据此创建三个ContractDataSet对象。最后调用DisplayBirthday方法将4个基于不同DateTimeMode的字段的时间和DateTimeKind打印出来。
最终的输出结果证实了我们上述的关于时间转换规则的结论:
到不前为止,我们貌似还看不到DataSetDateTime.Unspecified和DataSetDateTime.UnspecifiedLoca的差别。实际上,它们的差别体现在序列化上面:DataSetDateTime.UnspecifiedLoca在序列化的时候会保留基于当前时区的偏移量,而DataSetDateTime.Unspecified则不会。这个结论我也可以实例来证实,为此我写了如下一段代码对ContactDataSet进行序列化,并将序列化后的XML打印出来。
从输出的结果我们可以看出UnspecifiedBirthday和UnspecifiedLocalBirday之间的差别,后者有+8的偏移量,前者没有。