Detecting DST should be a basic function that’s included in Javascript. Sadly, along with many other basic functions, this one isn’t. For all my Google searches I wasn’t able to find a clear cut bullet proof DST detector. Many only worked in one hemisphere or specific timezones. I wrote this function to be bullet proof. It will detect the correct time zone no matter what.
As you’ll see from the code and comments, I hunt for Daylight Saving Time using a broad search to keep from being a CPU hog. Once I found DST I roll back a few hours and go on a more detailed search for the exact time DST changes over.
NOTE: This code is Dependant on my other function TimezoneDetect. You must use that function in conjunction with this one.
//Find start and end of DST
function DstDetect(){
var dtDstDetect = new Date();
var dtDstStart = '';
var dtDstEnd = '';
var dtDstStartHold = ''; //Temp date hold
var intYearDayCount = 732; //366 (include leap year) * 2 (for two years)
var intHourOfYear = 1;
var intDayOfYear;
var intOffset = TimezoneDetect(); //Custom function. Make sure you include it.
//Start from a year ago to make sure we include any previously starting DST
dtDstDetect = new Date()
dtDstDetect.setUTCFullYear(dtDstDetect.getUTCFullYear() - 1);
dtDstDetect.setUTCHours(0,0,0,0);
//Going hour by hour through the year will detect DST with shorter code but that could result in 8760
//FOR loops and several seconds of script execution time. Longer code narrows this down a little.
//Go one day at a time and find out approx time of DST and if there even is DST on this computer.
//Also need to make sure we catch the most current start and end cycle.
for(intDayOfYear = 1; intDayOfYear <= intYearDayCount; intDayOfYear++){
dtDstDetect.setUTCDate(dtDstDetect.getUTCDate() + 1);
if ((dtDstDetect.getTimezoneOffset() * (-1)) != intOffset && dtDstStartHold == ''){
dtDstStartHold = new Date(dtDstDetect);
}
if ((dtDstDetect.getTimezoneOffset() * (-1)) == intOffset && dtDstStartHold != ''){
dtDstStart = new Date(dtDstStartHold);
dtDstEnd = new Date(dtDstDetect);
dtDstStartHold = '';
//DST is being used in this timezone. Narrow the time down to the exact hour the change happens
//Remove 48 hours (a few extra to be on safe side) from the start/end date and find the exact change point
//Go hour by hour until a change in the timezone offset is detected.
dtDstStart.setUTCHours(dtDstStart.getUTCHours() - 48);
dtDstEnd.setUTCHours(dtDstEnd.getUTCHours() - 48);
//First find when DST starts
for(intHourOfYear=1; intHourOfYear <= 48; intHourOfYear++){
dtDstStart.setUTCHours(dtDstStart.getUTCHours() + 1);
//If we found it then exit the loop. dtDstStart will have the correct value left in it.
if ((dtDstStart.getTimezoneOffset() * (-1)) != intOffset){
break;
}
}
//Now find out when DST ends
for(intHourOfYear=1; intHourOfYear <= 48; intHourOfYear++){
dtDstEnd.setUTCHours(dtDstEnd.getUTCHours() + 1);
//If we found it then exit the loop. dtDstEnd will have the correct value left in it.
if ((dtDstEnd.getTimezoneOffset() * (-1)) != (intOffset + 60)){
break;
}
}
//Check if DST is currently on for this time frame. If it is then return these values.
//If not then keep going. The function will either return the last values collected
//or another value that is currently in effect
if ((new Date()).getTime() >= dtDstStart.getTime() && (new Date()).getTime() <= dtDstEnd.getTime()){
return new Array(dtDstStart,dtDstEnd);
}
}
}
return new Array(dtDstStart,dtDstEnd);
}
