繁体   English   中英

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

[英]How to convert a datetime to specific timezone in c#?

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

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

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

当我调试 time 的值time ,应用区域时应该是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);

结果是:

Local time zone is 'Pacific Standard Time'.
Converting GMT         to EST: 3/1/2013 8:00:00 PM
Converting Local       to EST: 3/2/2013 4:00:00 AM
Converting Unspecified to EST: 3/2/2013 4:00:00 AM

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

Local time zone is 'Eastern Standard Time'.
Converting GMT         to EST: 3/1/2013 8:00:00 PM
Converting Local       to EST: 3/2/2013 1:00:00 AM
Converting Unspecified to 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);

下面的代码将让你 go 从任何任意时区到任何其他。 我们使用DateTimeOffset ,它允许您传入 UTC 偏移量。您可以考虑仅使用DateTimeOffset而不是DateTime是否适合您的需要。 但是如果您想改用DateTime ,这里有一些代码可以为您进行转换:

public DateTime ChangeTimeZone(DateTime dateTimeInput, TimeZoneInfo sourceTimeZone, TimeZoneInfo destTimeZone)
{
    var zonedTime = new DateTimeOffset(DateTime.SpecifyKind(dateTimeInput, DateTimeKind.Unspecified),
                                       sourceTimeZone.GetUtcOffset(dateTimeInput));
    var utcTime = zonedTime.UtcDateTime;
    
    return TimeZoneInfo.ConvertTime(utcTime, destTimeZone);
}

您可能会注意到我们显式调用SpecifyKind并将其设置为Unspecified 这样做的原因是,如果在dateTimeInput上指定了Kind ,那么 UtcOffset 必须与该Kind匹配——所以如果它是 DateTimeKind.Utc,那么该数字必须是 0。如果它是本地的,那么它必须是本地的任何内容时间偏移量是否则你会得到一个例外。 当然,如果您已经知道Kind ,那么您可以跳过此 function 并直接将 go 直接转到TimeZoneInfo.ConvertTime

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM