【问题标题】:How to convert a datetime to specific timezone in c#?如何在 C# 中将日期时间转换为特定时区?
【发布时间】:2013-02-16 15:49:31
【问题描述】:

我需要帮助将 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 转换为不同的时区。

【问题讨论】:

标签: c#


【解决方案1】:

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

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 documentation

DateTimeKind.Local,引发 ArgumentException。

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

【讨论】:

    【解决方案2】:

    试试下面的 Chace

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-21
      • 2023-04-03
      • 1970-01-01
      • 1970-01-01
      • 2019-05-21
      • 1970-01-01
      相关资源
      最近更新 更多