Convert DateTime from UTC to EST in .Net 3.0
I am using .Net 3.0 and I want to convert a DateTime value from UTC to EST/EDT (need Daylight savings incorporated too).
I understand that this would 开发者_如何学Cbe straight-forward to achieve using .Net 3.5, with the help of TimeZoneInfo class
. I do not want to use Timezone.CurrentTimeZone
because I want this value converted to EST/EDT irrespective of the timezone of the local computer. Unfortunately switching to 3.5 is not an option. Search on the internet revealed options of using system registry and stuff.
Is there an easier way of doing this? Could anyone please lead me in the right direction and let me know the options to achieve this?
The following function determines whether a particular DateTime object represents Daylight Saving Time in the Eastern Time Zone.
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
}
}
}
}
With this function, you can convert the given DateTime accordingly. Example:
// 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);
精彩评论