在.Net 3.0中将DateTime从UTC转换为EST

时间:2011-08-31 22:27:41

标签: c#-3.0 timezone

我正在使用.Net 3.0,我希望将DateTime值从UTC转换为EST / EDT(也需要合并夏令时)。

据我所知,在TimeZoneInfo class的帮助下,使用.Net 3.5可以直接实现。我不想使用Timezone.CurrentTimeZone,因为我想将此值转换为EST / EDT,而不管本地计算机的时区。不幸的是,切换到3.5不是一种选择。在互联网上搜索显示使用系统注册表和东西的选项。

有更简单的方法吗? 任何人都可以带领我朝着正确的方向前进,让我知道实现这一目标的选择吗?

1 个答案:

答案 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);