C# 4.0 C#TimeZoneInfo.ConvertTimeToUtc不';与其他时间转换工具不匹配

C# 4.0 C#TimeZoneInfo.ConvertTimeToUtc不';与其他时间转换工具不匹配,c#-4.0,timezone,dst,C# 4.0,Timezone,Dst,我正在LINQPad中运行此代码段 DateTime dt = new DateTime(2011, 2, 1,15,0,0); dt.Dump(); TimeZoneInfo timeZoneId = TimeZoneInfo.FindSystemTimeZoneById("Samoa Standard Time"); //timeZoneId.GetAdjustmentRules().Dump(); var x = TimeZoneInfo.ConvertTimeToUtc(DateTime

我正在LINQPad中运行此代码段

DateTime dt = new DateTime(2011, 2, 1,15,0,0);
dt.Dump();
TimeZoneInfo timeZoneId = TimeZoneInfo.FindSystemTimeZoneById("Samoa Standard Time");
//timeZoneId.GetAdjustmentRules().Dump();
var x = TimeZoneInfo.ConvertTimeToUtc(DateTime.SpecifyKind(dt, DateTimeKind.Unspecified), timeZoneId);
x.Dump();
结果是: 2011年1月2日下午3:00:00 2011年2月2日凌晨1:00:00

当我转到a进行双重检查时,返回的值是:2/1/2011 2:00:00 AM。为什么.Net函数返回的值与其他站点不同。谁是对的?我们刚刚切换到夏令时(切换前我没有检查),这有关系吗

我们的QA发现了一份不匹配列表:

ID  GMT Offset  Name                DateTime Tested     Conversion Result   Correct GMT
                                        (Value in DB)
16  -11:00      Samoa               2/1/2011 3:00 PM    2/2/2011 1:00 AM    2/2/2011 2:00 AM
19  +12:00      Auckland, Wellington 2/1/2011 3:00 PM   2/1/2011 2:00 AM    2/1/2011 3:00 AM
20  +12:00      Fiji                2/1/2011 3:00 PM    2/1/2011 2:00 AM    2/1/2011 3:00 AM
23  +10:00      Canberra,           2/1/2011 3:00 PM    2/1/2011 4:00 AM    2/1/2011 5:00 AM
                Melbourne, Sydney
25  +10:00      Hobart              2/1/2011 3:00 PM    2/1/2011 4:00 AM    2/1/2011 5:00 AM
27  +09:30      Adelaide            2/1/2011 3:00 PM    2/1/2011 4:30 AM    2/1/2011 5:30 AM
68  +01:00      Windhoek            2/1/2011 3:00 PM    2/1/2011 1:00 PM    2/1/2011 2:00 PM
80  -03:00      Brasilia            2/1/2011 3:00 PM    2/1/2011 5:00 PM    2/1/2011 6:00 PM
84  -03:00      Montevideo          2/1/2011 3:00 PM    2/1/2011 5:00 PM    2/1/2011 6:00 PM
88  -04:00      Cuiaba              2/1/2011 3:00 PM    2/1/2011 6:00 PM    2/1/2011 7:00 PM
89  -04:00      Santiago            2/1/2011 3:00 PM    2/1/2011 6:00 PM    2/1/2011 7:00 PM

事实证明,这只是日光节约时间(或这些国家的版本)的差异。如果示例中的dt更改为
DateTime dt=new DateTime(2011,4,3,15,0,0);,返回的时间是凌晨2:00,getAdjustmentRules()方法显示了从2011年9月1日到2011年4月1日的转换时间,因此在4/1之后,他们的DaylightSavingsTime版本开始生效。

因为这个问题,我在MSDN()中读到了关于Noda time的内容。如果进行时间转换,请查看它