如何在c#中将日期时间转换为特定时区?

我需要帮助将DateTime转换为特定时区。 我下面的内容不能正常工作。

gmTime = 03/02/2013 1:00:00 AM

  TimeZoneInfo timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); var time = timeZoneInfo.ConvertTime(gmTime, timeZone); 

当我调试timetime ,应该是03/01/2013 8:00:00 PM应用区域时,它将返回03/02/2013 1:00:00 AM

如果我做time.ToLocalTime()然后我得到正确的值。 但是,我需要将time转换为不同的时区。

DateTime对象有一个“Kind”变量,可以帮助TimeZoneInfo知道如何对待它。 在TimeZone.ConvertTime的MSDN文档中 ,它具有以下内容:

DateTimeKind.Local,将本地时间转换为destinationTimeZone中的时间。

DateTimeKind.Utc,将协调世界时(UTC)转换为destinationTimeZone中的时间。

DateTimeKind.Unspecified,假设是本地的。

例如:

  Console.WriteLine("Local time zone is '{0}'.", TimeZoneInfo.Local.Id); var gmTime = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Utc); var localTime = new DateTime(2013, 03, 02, 01, 00, 00, DateTimeKind.Local); var unspecifiedTime = new DateTime(2013, 03, 02, 01, 00, 00); var timeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); var gmTimeConverted = TimeZoneInfo.ConvertTime(gmTime, timeZone); // 03/02/2013 8:00:00AM var localTimeConverted = TimeZoneInfo.ConvertTime(localTime, timeZone); // 03/02/2013 var unspecifiedTimeConverted = TimeZoneInfo.ConvertTime(unspecifiedTime, timeZone); Console.WriteLine("Converting GMT to EST: {0}", gmTimeConverted); Console.WriteLine("Converting Local to EST: {0}", localTimeConverted); Console.WriteLine("Converting Unspecified to EST: {0}", unspecifiedTimeConverted); 

结果是:

当地时区是“太平洋标准时间”。
将GMT转换为EST:3/1/2013 8:00:00 PM
将本地转换为EST:3/2/2013 4:00:00 AM
将未指定转换为EST:3/2/2013 4:00:00 AM

或者,如果您当地的时区是“东部标准时间”,则会获得这些结果

当地时区是“东部标准时间”。
将GMT转换为EST:3/1/2013 8:00:00 PM
将本地转换为EST:2013年3月2日凌晨1:00:00
转换未指定为EST:3/2/2013 1:00:00 AM

如果您希望TimeZoneInfo像Utc一样处理’Unspecified’,那么您应该像TimeZoneInfo.ConvertTimeFromUtc一样运行。 再次来自MSDN文档

DateTimeKind.Local,抛出ArgumentException。

DateTimeKind.Unspecified或DateTimeKind.Utc,从协调世界时(UTC)转换。

尝试类似下面的Chace

 TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time"); DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, estTimeZone);