我发现“大西洋中部标准时间”的 Windows 时区与 IANA 的映射是“Etc/GMT+2”和“Etc/GMT+1”
根据实际数据,我发现:2011 年 3 月 27 日凌晨 3:00:00 到 2011 年 9 月 25 日凌晨 12:59:59 将是 Etc/GMT+1 2011 年 9 月 25 日凌晨 1:00:00 到2012 年 3 月 25 日凌晨 2:59:59 将是 Etc/GMT+2
这是我用来证明映射正确的代码:
var currentDateTime = DateTime.Now;
int currYear = currentDateTime.Year;
using(var database = Common.Patterns.TimeZoneInfo.Database.IANA.OpenInMemroyReadOnlyDatabase())
{
var winTimeZone = System.TimeZoneInfo.FindSystemTimeZoneById("Mid-Atlantic Standard Time");
var commonTimeZoneSG = Zone.FindZone(database, "Atlantic/South_Georgia", ZoneNameTypes.IANATZName);
var commonTimeZoneNoronho = Zone.FindZone(database, "America/Noronha", ZoneNameTypes.IANATZName);
var commonTimeZoneGMT2 = Zone.FindZone(database, "Etc/GMT+2", ZoneNameTypes.IANATZName);
var commonTimeZoneGMT1 = Zone.FindZone(database, "Etc/GMT+1", ZoneNameTypes.IANATZName);
for (int nMonth = 1; nMonth <= 12; ++nMonth)
{
int nbrDays = DateTime.DaysInMonth(currYear, nMonth);
for (int nDay = 1; nDay <= nbrDays; ++nDay)
{
var currDateTime = new DateTime(currYear, nMonth, nDay, 11, 30, 09);
//September 30 - March 24
if(winTimeZone.GetUtcOffset(currDateTime) == commonTimeZoneSG.DetermineUTCOffset(currDateTime).Value)
{
break;
}
else if(winTimeZone.GetUtcOffset(currDateTime) == commonTimeZoneNoronho.DetermineUTCOffset(currDateTime).Value)
{
break;
}
else if(winTimeZone.GetUtcOffset(currDateTime) == commonTimeZoneGMT2.DetermineUTCOffset(currDateTime).Value)
{
break;
}
//March 25 - September 29
if(winTimeZone.GetUtcOffset(currDateTime) == commonTimeZoneGMT1.DetermineUTCOffset(currDateTime).Value)
{
break;
}
else
{
Console.WriteLine(string.Format("not mappable for {0}",currDateTime));
break;
}
}
}
}
这是我发现的过渡规则:
System.TimeZoneInfo.FindSystemTimeZoneById("Mid-Atlantic Standard Time").GetAdjustmentRules().Dump();
我似乎无法将我发现的转换开始和结束规则与真实数据联系起来。它说它从凌晨 2 点开始,但我的真实数据是凌晨 3 点并在凌晨 1 点结束。
谁能解释一下?