【问题标题】:TimeZoneInfo.ConvertTimeFromUTC produce different output then TimeZone.BaseUTCOffsetTimeZoneInfo.ConvertTimeFromUTC 产生与 TimeZone.BaseUTCOffset 不同的输出
【发布时间】:2019-12-12 14:10:22
【问题描述】:

我有一个 UTC 日期时间,我需要将其转换为 EST 时区。应该就这么简单

 var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
 var dt = DateTime.SpecifyKind(value, DateTimeKind.Utc);            
 return TimeZoneInfo.ConvertTimeFromUtc(dt, easternZone);

所以我输入的日期是

02-08-2019 22:53:32

结果值为

02-08-2019 18:53:32

它会从给定时间减去 4 小时。

但是如果我检查东部标准时区和 UTC 时区之间的偏移量,那么它返回的值是

easternZone.BaseUtcOffset {-05:00:00} System.TimeSpan

如果这是真的,那么上面的结果值应该是

02-08-2019 17:53:32

我不确定我在这里缺少什么。

【问题讨论】:

  • 您是否检查过您收到的TimeZoneInfo 是否在夏令时?
  • 我对你的问题有点困惑,我尽力回答:你的代码实际上没有问题,the difference between UTC and EST is actually 4 hours. 但是,如果你需要时差为 5 小时,那么使用中部标准时间 (CST)

标签: c# datetime utc


【解决方案1】:

我不确定我在这里缺少什么。

BaseUtcOffset 不考虑夏令时(它不能,因为它不知道您感兴趣的具体日期)。你可能想使用GetUtcOffset

返回的时间跨度包括由于应用程序造成的任何差异 对当前时区的调整规则。它不同于 BaseUtcOffset 属性,它返回之间的差异 协调世界时 (UTC) 和时区的标准时间 因此,不考虑调整规则。

调整规则讨论here(强调我的):

提供有关时区调整的信息,例如 夏令时转换。

作为一般规则,如果日期与您的预期相差

为了说明夏令时的影响:

var timeUtc = Convert.ToDateTime("01-01-2019 22:53:32");
var easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
var dt = DateTime.SpecifyKind(timeUtc, DateTimeKind.Utc);            
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(dt, easternZone));
Console.WriteLine(easternZone.GetUtcOffset(dt));

timeUtc = Convert.ToDateTime("07-07-2019 22:53:32");
easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
dt = DateTime.SpecifyKind(timeUtc, DateTimeKind.Utc);            
Console.WriteLine(TimeZoneInfo.ConvertTimeFromUtc(dt, easternZone));
Console.WriteLine(easternZone.GetUtcOffset(dt));

上面的代码会输出:

1/1/2019 5:53:32 PM
-05:00:00
7/7/2019 6:53:32 PM
-04:00:00

【讨论】:

    【解决方案2】:

    试试这个:

    var timeUtc = Convert.ToDateTime("02-08-2019 22:53:32");
    TimeZoneInfo easternZone = TimeZoneInfo.FindSystemTimeZoneById("Eastern Standard Time");
    DateTime easternTime = TimeZoneInfo.ConvertTimeFromUtc(timeUtc, easternZone);
    Console.WriteLine(easternTime);
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-06
      • 2014-08-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多