TimeZoneInfo.ConvertTimeFromUTC 产生与 TimeZone.BaseUTCOffset 不同的输出

TimeZoneInfo.ConvertTimeFromUTC produce different output then TimeZone.BaseUTCOffset

我有一个 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 时区之间的偏移量,那么它的值 return 是

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

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

02-08-2019 17:53:32

我不确定我在这里遗漏了什么。

I am not sure what I am missing here.

BaseUtcOffset does not take into account daylight saving time (it can't, since it doesn't know what specific date you are interested in). You likely want to use GetUtcOffset:

The returned time span includes any differences due to the application of adjustment rules to the current time zone. It differs from the BaseUtcOffset property, which returns the difference between Coordinated Universal Time (UTC) and the time zone's standard time and, therefore, does not take adjustment rules into account.

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

Provides information about a time zone adjustment, such as the transition to and from daylight saving time.

一般来说,如果日期与您的预期相差 <= 1 小时,请查看夏令时问题。

为了说明夏令时的影响:

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

试试这个:

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);