C# 使用时区将datetime转换为UTC有时工作不正确

C# 使用时区将datetime转换为UTC有时工作不正确,c#,.net,datetime,C#,.net,Datetime,我有一种使用特定时区将日期时间从本地转换为UTC的方法: TimeZoneInfo timeZone = FindSystemTimeZoneById(timeZoneId); DateTime dateTimeInUtc = TimeZoneInfo.ConvertTimeToUtc(localDateTime, timeZone); return dateTimeInUtc; 但有时我不知道什么时候以及为什么,但大多数时候它都能正常工作,这种转换并不像我预期的那样有效。 例如: 时区是-5

我有一种使用特定时区将日期时间从本地转换为UTC的方法:

TimeZoneInfo timeZone = FindSystemTimeZoneById(timeZoneId);
DateTime dateTimeInUtc = TimeZoneInfo.ConvertTimeToUtc(localDateTime, timeZone);
return dateTimeInUtc;
但有时我不知道什么时候以及为什么,但大多数时候它都能正常工作,这种转换并不像我预期的那样有效。 例如:

时区是-5 当地时间为2013年8月28日12:00:00 AM DateTimeKind未指定 那么,在这行代码之后,您对上面的值有什么期望呢

DateTime dateTimeInUtc = TimeZoneInfo.ConvertTimeToUtc(localDateTime, timeZone);
我预计UTC时间为2013年8月28日上午5:00:00。但是

2013年8月28日上午4:00:00。如果时区为-5,则不正确

完全相同的代码在几个月内正常工作。即使当我看到调试器转换是正确的。
大约两周前,我在错误转换这段代码时遇到了同样的问题。但是在第二天,问题消失了,代码没有任何变化。

-5是UTC的基本偏移量,但在夏令时期间,该偏移量由1小时变为-4

美国2013年夏令时开始于

三月十日(星期日)

截止时间为周一凌晨2:00

11月3日,星期日


在此期间,大多数州将时钟向前移动1小时,但亚利桑那州除外,例如,UTC基准偏移量为-5,但在夏时制期间,时钟向前移动1小时至-4

美国2013年夏令时开始于

三月十日(星期日)

截止时间为周一凌晨2:00

11月3日,星期日


在此期间,除亚利桑那州外,大多数州将时钟向前拨1小时,但在此期间,我转换为UTC时有+5小时。一周前是5个小时,代码相同。@SergeyGavruk你用的是什么日期?相同的?或者你使用的日期是3月10日之前还是11月3日之后?嗯,可能是因为我的日期不在这个范围内。Thanks@SergeyGavruk还应始终确保使用内置函数在UTC和本地之间进行转换。国会之前已经更改了DST的日期,并且每年都有所不同。在计算时差时,您在日期(如减法)上所做的任何计算都应在UTC时间内完成。11月3日的2:00-3:00也有一个模棱两可的时间,如果我不告诉你DST与否,你就无法分辨它是哪一个。。因为你看到2:00两次。我用DST范围检查了不同日期的方法,你是对的。BaseUtcOffset把我弄糊涂了。谢谢。但在这段时间,我转换为UTC时有+5个小时。一周前是5个小时,代码相同。@SergeyGavruk你用的是什么日期?相同的?或者你使用的日期是3月10日之前还是11月3日之后?嗯,可能是因为我的日期不在这个范围内。Thanks@SergeyGavruk还应始终确保使用内置函数在UTC和本地之间进行转换。国会之前已经更改了DST的日期,并且每年都有所不同。在计算时差时,您在日期(如减法)上所做的任何计算都应在UTC时间内完成。11月3日的2:00-3:00也有一个模棱两可的时间,如果我不告诉你DST与否,你就无法分辨它是哪一个。。因为你看到2:00两次。我用DST范围检查了不同日期的方法,你是对的。BaseUtcOffset把我弄糊涂了。非常感谢。