2011-08-31 96 views
0

我正在使用.Net 3.0,我想將UTC的日期時間值轉換爲EST/EDT(需要夏時制)。在.Net 3.0中將UTC的UTC轉換爲EST的時間

據我所知,在TimeZoneInfo class的幫助下,這將是直接實現.Net 3.5。我不想使用Timezone.CurrentTimeZone,因爲我希望將此值轉換爲EST/EDT,而不考慮本地計算機的時區。不幸的是切換到3.5不是一種選擇。在互聯網上搜索顯示使用系統註冊表和東西的選項。

有沒有更簡單的方法來做到這一點? 任何人都可以引導我走向正確的方向,讓我知道實現這個目標的選擇嗎?

回答

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 is assumed to be in UTC, not local time 
bool dst=IsEasternDaylightTime(dateTime); 
if(dst) 
    dateTime=dateTime.AddHours(-4); 
else 
    dateTime=dateTime.AddHours(-5);  
+0

非常感謝您的回覆!這有幫助。 – SupCSharp