我正在使用.Net 3.0,我希望将DateTime值从UTC转换为EST / EDT(也需要合并夏令时)。
据我所知,在TimeZoneInfo class
的帮助下,使用.Net 3.5可以直接实现。我不想使用Timezone.CurrentTimeZone
,因为我想将此值转换为EST / EDT,而不管本地计算机的时区。不幸的是,切换到3.5不是一种选择。在互联网上搜索显示使用系统注册表和东西的选项。
有更简单的方法吗? 任何人都可以带领我朝着正确的方向前进,让我知道实现这一目标的选择吗?
答案 0 :(得分:0)
以下函数确定特定DateTime对象是否表示东部时区的夏令时。
public static bool IsEasternDaylightTime(DateTime dt){
// Find out whether it's Daylight Saving Time
dt=dt.AddHours(-5); // Convert to Eastern Standard Time
if(dt.Year<=2006){
// 2006 and earlier
if(dt.Month<=3 || dt.Month>=11){
// Standard Time
return false;
} else if(dt.Month>=5 && dt.Month<=9){
// Daylight Time
return true;
} else if(dt.Month==4){
// find the first Sunday of April
int firstSunday=1;
while(new DateTime(dt.Year,dt.Month,firstSunday).DayOfWeek!= DayOfWeek.Sunday){
firstSunday++;
}
if(dt.Day<firstSunday)
return false;
else if(dt.Day>firstSunday)
return true;
else {
// DST begins at 2AM
if(dt.Hour<2)
return false; // Standard Time
else if(dt.Hour>=3)
return true; // Daylight Time
else
return false; // Ambiguous Time
}
} else {
// find the last Sunday of October
int lastSunday=1;
for(int i=1;i<=31;i++){
if(new DateTime(dt.Year,dt.Month,i).DayOfWeek== DayOfWeek.Sunday){
lastSunday=i;
}
}
if(dt.Day<lastSunday)
return true;
else if(dt.Day>lastSunday)
return false;
else {
// DST ends at 2AM
if(dt.Hour<1)
return true; // Daylight Time
else if(dt.Hour>=2)
return false; // Standard Time
else
return false; // Standard Time
}
}
} else {
// 2007 and later
if(dt.Month<=2 || dt.Month>=12){
// Standard Time
return false;
} else if(dt.Month>=4 && dt.Month<=10){
// Daylight Time
return true;
} else if(dt.Month==3){
// find the second Sunday of March
int sundays=0;
int lastSunday=1;
for(int i=1;i<=31;i++){
if(new DateTime(dt.Year,dt.Month,i).DayOfWeek== DayOfWeek.Sunday){
lastSunday=i;
sundays++;
if(sundays==2)break;
}
}
if(dt.Day<lastSunday)
return false;
else if(dt.Day>lastSunday)
return true;
else {
// DST begins at 2AM
if(dt.Hour<2)
return false; // Standard Time
else if(dt.Hour>=3)
return true; // Daylight Time
else
return false; // Ambiguous Time
}
} else {
// find the first Sunday of November
int firstSunday=1;
while(new DateTime(dt.Year,dt.Month,firstSunday).DayOfWeek!= DayOfWeek.Sunday){
firstSunday++;
}
if(dt.Day<firstSunday)
return true;
else if(dt.Day>firstSunday)
return false;
else {
// DST ends at 2AM
if(dt.Hour<1)
return true; // Daylight Time
else if(dt.Hour>=2)
return false; // Standard Time
else
return false; // Standard Time
}
}
}
}
使用此功能,您可以相应地转换给定的DateTime。例如:
// dateTime is assumed to be in UTC, not local time
bool dst=IsEasternDaylightTime(dateTime);
if(dst)
dateTime=dateTime.AddHours(-4);
else
dateTime=dateTime.AddHours(-5);