Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 将DateTime转换为UTC时的调整规则是什么?_C#_Datetime_Timezone_Utc - Fatal编程技术网

C# 将DateTime转换为UTC时的调整规则是什么?

C# 将DateTime转换为UTC时的调整规则是什么?,c#,datetime,timezone,utc,C#,Datetime,Timezone,Utc,在的MSDN页面中,有以下信息框: 如果当前计算机的本地时区包含多个调整规则,则ConvertTimeToUtc方法的此重载会返回与TimeZone.ToUniversalTime和DateTime.ToUniversalTime方法不同的结果。TimeZone.ToUniversalTime始终将当前调整规则应用于时区转换,无论dateTime是否在其日期范围内。在.NET Framework 3.5上执行时,DateTime.ToUniversalTime还将当前调整规则应用于时区转换,无论

在的MSDN页面中,有以下信息框:

如果当前计算机的本地时区包含多个调整规则,则ConvertTimeToUtc方法的此重载会返回与TimeZone.ToUniversalTime和DateTime.ToUniversalTime方法不同的结果。TimeZone.ToUniversalTime始终将当前调整规则应用于时区转换,无论dateTime是否在其日期范围内。在.NET Framework 3.5上执行时,DateTime.ToUniversalTime还将当前调整规则应用于时区转换,无论DateTime是否在其日期范围内


我不确定我是否理解这意味着什么。这些调整规则是什么,以及
ConvertTimeToUtc()
TimeZone.ToUniversalTime()
之间的结果有何不同。在撰写本文时,我的电脑被设置为美国太平洋时区,今天是2015年3月2日。目前是太平洋标准时间(或PST),比UTC晚8小时

DateTime dt = new DateTime(2006, 4, 1, 0, 0, 0);
TimeZoneInfo tzi = TimeZoneInfo.Local;
DateTime utc = TimeZoneInfo.ConvertTimeToUtc(dt, tzi);
在上面的代码中,我正在将另一个值(2006年4月1日午夜)从我的时区转换为UTC。在那个特定的时间点,太平洋标准时间(PST)生效。上面的代码使用了
TimeZoneInfo
,这是正确的方法。输出为2006年4月1日UTC上午8:00

现在看看这段代码:

DateTime dt = new DateTime(2006, 4, 1, 0, 0, 0);
TimeZone tz = TimeZone.CurrentTimeZone;
DateTime utc = tz.ToUniversalTime(dt);
它似乎也在做同样的事情。但它返回的UTC上午7:00的值不正确

发生这种情况是因为美国的规则自2007年起生效。在本例中的日期,DST未根据当时的规则生效,但如果当时的规则生效,则DST将生效

很简单,
TimeZoneInfo
对象知道这一变化,但
TimeZone
对象不知道。它错误地认为现行规则始终有效

TimeZone
类上的其他方法也会发生同样的情况,这就是为什么会说:

重要
尽可能使用
TimeZoneInfo
类而不是
TimeZone

此外,
时区
类已从新项目中删除

关于“调整规则”-MSDN备注具体指的是类,用于跟踪时区内定期或不定期发生的时区偏移变化。夏令时是一种可能发生的变化,但也有其他变化

您可能希望阅读StackOverflow Wiki,了解这些更改背后的机制

你也可以试试我的Pluralsight课程,它更详细地解释了这些概念


另请参见:

调整规则的一个示例是英国夏季时间,即在英国,夏季月份与格林尼治标准时间之间有一个小时的偏移