Answers:
DateTime本身不包含任何实时时区信息。它可能知道它是UTC还是本地的,但不知道本地的真正含义。
DateTimeOffset更好一些-基本上是UTC时间和偏移量。但是,这仍然不足以确定时区,因为许多不同的时区在任何一个时间点都可以具有相同的偏移量。听起来这可能对您来说已经足够了,因为解析日期/时间时要做的就是偏移。
从.NET 3.5开始,对时区的支持要好得多,但是我真的很想看到一个标准的“ ZonedDateTime”或类似的东西-UTC时间和实际时区。自己构建很容易,但是很高兴在标准库中看到它。
编辑:近四年后,我现在建议使用Noda Time,它具有一组比较丰富的日期/时间类型。不过,我还是有偏见,作为Noda Time的主要作者:)
.NET有一个公共领域的TimeZone库。真的很有用。它将满足您的需求。
解决一般情况下的时区问题比您想象的要难。
您可以使用TimeZoneInfo类
TimeZone类可以识别本地时区,并且可以在协调世界时(UTC)和本地时间之间转换时间。TimeZoneInfo对象可以表示任何时区,并且TimeZoneInfo类的方法可以用于将一个时区中的时间转换为任何其他时区中的相应时间。TimeZoneInfo类的成员支持以下操作:
检索操作系统已定义的时区。
枚举系统上可用的时区。
不同时区之间的转换时间。
创建操作系统尚未定义的新时区。
序列化时区以便以后检索。
从API(http://msdn.microsoft.com/zh-cn/library/system.datetime_members ( VS.71 ) .aspx)中,它似乎无法显示所用时区的名称。
DateTime不知道其时区偏移量。没有内置方法可以返回偏移量或时区名称(例如EAT,CEST,EST等)。
就像其他人建议的那样,您可以将日期转换为UTC:
DateTime localtime = new DateTime.Now;
var utctime = localtime.ToUniversalTime();
然后只计算差异:
TimeSpan difference = localtime - utctime;
另外,您可以使用DateTimeOffset将一个时间转换为另一个时间:
DateTimeOffset targetTime = DateTimeOffset.Now.ToOffset(new TimeSpan(5, 30, 0));
但这是一种有损压缩-偏移量无法单独告诉您哪个时区,因为两个不同的国家/地区可能位于不同的时区,并且仅在一年的一部分时间内具有相同的时间(例如,南非和欧洲)。另外,请注意,夏季夏令时可能会在不同的日期(EST与CET-3周的差异)引入。
您可以使用TimeZoneInfo类获取本地系统时区的名称:
TimeZoneInfo localZone = TimeZoneInfo.Local;
localZone.IsDaylightSavingTime(localtime) ? localZone.DaylightName : localZone.StandardName
我同意Gerrie Schenck的观点,请阅读他建议的文章。