Конвертировать DateTime из UTC в EST в .Net 3.0 - PullRequest
0 голосов
/ 01 сентября 2011

Я использую .Net 3.0 и хочу преобразовать значение DateTime из UTC в EST / EDT (необходимо также включить переход на летнее время).

Я понимаю, что было бы просто достичь использования .Net 3.5 с помощью TimeZoneInfo class. Я не хочу использовать Timezone.CurrentTimeZone, потому что я хочу, чтобы это значение было преобразовано в EST / EDT независимо от часового пояса локального компьютера. К сожалению, переход на 3.5 не вариант. Поиск в интернете выявил варианты использования системного реестра и прочее.

Есть ли более простой способ сделать это? Может ли кто-нибудь, пожалуйста, привести меня в правильном направлении и дать мне знать, как этого добиться?

1 Ответ

0 голосов
/ 01 сентября 2011

Следующая функция определяет, представляет ли конкретный объект 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);       
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...