[development] Re-Thinking Events in Drupal (and time zones too)

Rob Thorne rob at torenware.com
Mon Mar 6 09:37:14 UTC 2006


One of the best defenses of using Unix timestamps has to do with 
handling daylight savings time/ summer time.  Correctly handling dates 
in time zones that have transitions during the year is very hard to do 
right unless you use Unix timestamps.

This is also why I'm not sure using database functions is the right 
approach;  we'll just be trading one set of problems for another.  But I 
think there's a way out of this.  I've spent some time over the last day 
or two looking at the Arthur Olsen library, and have a suggestion of how 
to solve the DST/ST problem in a general way.

The way the Olsen libraries work is that for every geopolitical unit in 
the world, there's only a few cases:

    * Either the unit's time is some constant offset in seconds from
      UTC/GMT (i.e., standard time all the time), or
    * Standard time has a some offset from UTC, and at a point in the
      year, you switch to summer time, and at another point in the year,
      you switch back.  Different countries do the shifts on different
      dates, and the northern hemisphere and the southern hemisphere
      obviously have summer time at opposite times of the year.

So Olson's solution is to compile all the various rules into a data file 
that tracks the exact Unix timestamp for every "transition" in the time 
zone.  The compiled objects let you do a binary lookup to find which 
"state" you're in at a given part of the year.  Once you know your 
"state", you look up the offset from UTC for that part of the year, and 
you know for every date of the year how many seconds you need to 
add/subtract from UTC to get local time.

The solution for us, I think, is to turn these binary lookup tables into 
PHP objects with the same information.  You store the transition times 
and offsets in the database.  When you need to calculate a date, load 
the data for that time zone from the database, and store away two 
arrays:  the presorted array of transition times, and a corresponding 
array of offsets from UTC for the period that starts with that Unix time 
stamp.  You only need to do this once per request per time zone, and you 
only need to do it for the time zones you use.

This will be pretty fast, and will be correct for any time zone that the 
Olson database knows about, which is pretty much everybody.  And even 
better: it doesn't depend upon PHP implementing this correctly, nor does 
it depend upon the services we get from a DB engine like MySQL or 
Postgresql.

I wrote a little perl script today that generates the needed SQL for 
Olson's current 2006 figures.  That's the only part that would be new to 
most of you.  I haven't written the code yet to do the calc, but once 
most of you look at the data, it will be pretty obvious how to do it.

I'll a bit more info about how to do this later.  But given how many 
countries were represented at our meeting in Vancouver, I think it's 
worth getting this right finally.

Cheers,
Rob Thorne
Torenware Networks


Khalid B wrote:
> I am confused too Adrian as to which one are you advocating?
>
> I have always wondered why we used UNIX timestamps while there
> are database native types for date and time.
>
> Over time, I got used to the timestamp things, and it does not
> bother me much anymore.
>
> I wrote some primitive routines to handle FormAPI to timestamp
> and vice versa.
>
> function fapi2date($date = array()) {
>   return strtotime($date['year'] . '-' . $date['month'] . '-' . $date['day']);
> }
>
> function date2fapi($date) {
>   if (!$date) {
>     $date = time();
>   }
>
>   $fapi_date = array();
>
>   $fapi_date['year']  = date('Y', $date);
>   $fapi_date['month'] = date('j', $date);
>   $fapi_date['day']   = date('d', $date);
>
>   return $fapi_date;
> }
>
> I still miss the ability to handle dates in the back end in queries though.
>
> On 3/5/06, Robert Douglass <rob at robshouse.net> wrote:
>   
>> So wait, you're confusing me. Which approach are you advocating? Db
>> handled date/times, or timestamp()/PHP handled???
>> Adrian Rossouw wrote:
>>     
>>> On 05 Mar 2006, at 11:22 AM, Bèr Kessels wrote:
>>>
>>>       
>>>> I think nearly all modules out there should try to rethink how / if
>>>> they would be if they were nothing more then bunch of a:
>>>>  Views and CCK definitions,  Views and CCK extensions and custom  logic.
>>>>         
>>> Yup.
>>>
>>> since we are doing the date type stuff now properly.
>>>
>>> how about we consider moving to actual in-database date fields  instead
>>> of using timestamps.
>>>
>>> i quite like being able to use the database for my date handling.  Truth
>>> be told, that is before
>>> I started using strtotime (which is by far the most useful function  in
>>> php's date handling lib),
>>> and was dissillusioned at how horrible mysql's date handling is
>>> compared to postgres.
>>>       
>
>   



More information about the development mailing list