17

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

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

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

当我调试 的值时time,应该03/01/2013 8:00:00 PM是应用区域时,它返回为03/02/2013 1:00:00 AM.

如果我这样做,time.ToLocalTime()那么我会得到正确的值。但是,我需要转换time到不同的时区。

4

2 回答 2

18

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:2013 年 3 月 1 日晚上 8:00:00
将本地转换为 EST:2013 年 3 月 2 日凌晨 4:00:00
将未指定转换为 EST:2013 年 3 月 2 日凌晨 4:00:00

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

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



如果您希望 TimeZoneInfo 像 Utc 一样对待“未指定”,您应该像 TimeZoneInfo.ConvertTimeFromUtc 一样运行。再次来自MSDN 文档

DateTimeKind.Local,引发 ArgumentException。

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

于 2013-03-02T15:31:40.260 回答
8

尝试类似下面的 Chace

TimeZoneInfo estTimeZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
DateTime estDateTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, estTimeZone);
于 2013-03-02T01:40:30.893 回答