Re: DAYLIGHT SAVINGS TIME OR NOT

From: Date: Wed, 14 Jul 2004 21:45:09 +0000
Subject: Re: DAYLIGHT SAVINGS TIME OR NOT
References: 1 2  Groups: php.general 
Request: Send a blank email to php-general+get-190539@lists.php.net to get a copy of this message
<?php // here is the date. We wont worry about the time. $processdate = "07/04/2004 14:45";
What about different formats like 07-04-2004 14:45:00
...You have a good point, Curt. We could modify the code just a little bit for the same then. Instead of exploding with "/", we may opt for "-" explosion. Typically, I have observed users using one specific format for their entire application. A simple change in the function can make the function suit their requirements.
// calling the function. // 1 means the date is in a daylight savings time // 0 means the date is not in a daylight savings time
one thing to note, not all zones, even in the US honor the DST. this is a rather sepecific function.
...I believe Indiana and Arizona do not honor daylight savings time. They switch back and forth from EST to CST (Indiana) and MST to PST (Arizona) if I am not mistaken. If it is not applicable to a particular user(s), they should not use this function. This function could be useful for only those who intend to use it.
echo daylight($processdate); // now the function function daylight($mydate) { // separating the date and time $datetime = explode(" ",$mydate); // exploding the components of date $dateexplode = explode("/",$datetime[0]);
Instead of exploding stuff around, make your date argument compatible with the strtotime() function, it will return a unix timestamp or -1 if it fails to parse the date.
...Good point. I should write something with strtotime(). Thank you.
// if the date is between Jan-Mar, NO DAYLIGHT // if the date is between Nov-Dec, NO DAYLIGHT if ($dateexplode[0]<4 or $dateexplode[0]>10) { return 0; } // if the date is not in the above zone, lets see // if the date is between May-Sep, DAYLIGHT elseif ($dateexplode[0]>4 and $dateexplode[0]<10) { return 1; }
Since you have a timestamp as I suggested above, you simply need to pull the month out, and then check the month value:
...I used the above method to indicate to users what is going on. I did not use switch :: case because I did not want a month-to-month checking. I wanted to check and process for only months 4 through 10 and for only those dates in month 4 & 10 that made a difference between CST and CDT (or any time zone change, in that case).
$month = strftime('%m', $utimestamp); swtich ($month) {
    case '01': case '02': ...
       return 0;
    case '05': case '06': ...
       return 1;
         }
else { // we are going to pull out what date is a sunday // then we compare our date's day-of-month with the day-that-is-sunday $interestday = 0; // lets see what happens in april - first sunday of the month if ($dateexplode[0]==4) { // looping the first seven days to see what day is a sunday for ($i=1; $i<=7; $i++) { $myday = date("w",mktime(0,0,0,$dateexplode[0],$i,$dateexplode[2])); if ($myday==0) $interestday = $i; } // now that we got what day is a sunday, lets see // if our date's day-of-month is greater than this or not // if it is greater, then DAYLIGHT if ($dateexplode[1]>=$interestday) return 1; else return 0; } // lets see what happens in october - last sunday of the month elseif ($dateexplode[0]==10) { // looping the first seven days to see what day is a sunday for ($i=25; $i<=31; $i++) { $myday = date("w",mktime(0,0,0,$dateexplode[0],$i,$dateexplode[2])); if ($myday==0) $interestday = $i; } // now that we got what day is a sunday, lets see // if our date's day-of-month is greater than this or not // if it is less, then DAYLIGHT if ($dateexplode[1]<=$interestday) return 1; else return 0; } }
now instead of doing all that mundane work, we simply have to find out if the days are outabounds for the paticular months.
...Your code looks neater. Thank you.
// obtain the day of month $dayofmonth = (int)strftime('%d', $utimestamp); // and the day of week $dayofweek = strftime('%u', $utimestamp); if ($month == '04') {
    // If its the first week of 04
    if ($dayofmonth <= 7) {
      // and we havn't reached sunday, return 0
      return ($dayofweek < 7) ? 0: 1;
    }
    return 1; // otherwise we're passed it.
     } elseif ($month == '10') {
        // look at the last week october
    if ($dayofmonth >= 24) {
             // see if we're still in the zone.
      return ($dayofweek < 7) ? 1: 0;
    }
    return 1;
} // something went wrong. return -2;
}
Curt
...Thanks for your comments, Curt. Whenever I write a better code, I will post it here. Chirag Shukla.

« previous php.general (#190539) next »