[egenix-users] mx.DateTime gmtoffset gmtime DST messup

François Meyer fmeyer at obs-besancon.fr
Tue Oct 30 11:09:25 CET 2012


Hi,

I ran through a weird problem with mx.DateTime
during last DST switch on CET on sunday 2012-10-28 01:00 UTC.

CET is on DST at UTC+2 up to 2012-10-18 01:00 UTC, 
then switches to UTC+1.

In fact, for one hour past the switch, gmtoffset remained
stuck at +2 instead of +1.

The machine monitors a timing system, the monitoring is driven by 
a python script, and it needs TZ info. I ran through the problem 
looking at the logs during the night of the switch from DST.

The logs are a bit verbose so I reproduce a simplified version 
of what happenned on another machine ; this tiny script is ran 
on a Ubuntu 12.04.1, system time is UTC.

   #!/usr/bin/python
   from mx import DateTime
   from time import sleep
   t=DateTime.now()
   while 1:
       print "------------------------------------------------"
       print "t = DateTime.now() : ", t
       print "t.gmtoffset ", t.gmtoffset()
       print "t.gmtime ", t.gmtime()
       sleep(5)

I will set time on the machine, run this script on CET timezone
and see what happens around the switch date (20121028 01:00 UTC).

1st test, close to what really happened :

I first set system (UTC) time at 2012-10-27 23:59, and check, 
I get that :

   root at ganymede:~# date -s"20121027 23:59"; date; TZ=CET date;
   Sat Oct 27 23:59:00 UTC 2012
   Sat Oct 27 23:59:00 UTC 2012
   Sun Oct 28 01:59:00 CEST 2012

then I run the script, in CET timezone :

   fm at ganymede:~$ TZ=CET ./test_tz.py
   t = DateTime.now() :  2012-10-28 01:59:00.04
   t.gmtoffset  02:00:00.00
   t.gmtime  2012-10-27 23:59:00.04

There all is ok. Two minutes later :

   ------------------------------------------------
   t = DateTime.now() :  2012-10-28 02:01:08.90
   t.gmtoffset  02:00:00.00
   t.gmtime  2012-10-28 00:01:08.90

still ok (but see further ref [1] in the text)

One hour later, one minute before the switch :

   ------------------------------------------------
   t = DateTime.now() :  2012-10-28 02:59:01.80
   t.gmtoffset  02:00:00.00
   t.gmtime  2012-10-28 00:59:01.80

Still ok

One minute later, after the switch :

   ------------------------------------------------
   t = DateTime.now() :  2012-10-28 02:00:01.86
   t.gmtoffset  02:00:00.00
   t.gmtime  2012-10-28 00:00:01.86

t is ok,
gmtoffset is bogus
gmtime is bogus, one hour back

that situation lasts one hour :

   ------------------------------------------------
   t = DateTime.now() :  2012-10-28 02:59:59.65
   t.gmtoffset  02:00:00.00
   t.gmtime  2012-10-28 00:59:59.65

still bogus.

   ------------------------------------------------
   t = DateTime.now() :  2012-10-28 03:00:04.66
   t.gmtoffset  01:00:00.00
   t.gmtime  2012-10-28 02:00:04.66

back to normal. 
This is exactly the behaviour I observed in my logs.

2nd test : I first set the date 1 hour before the switch and check :

   root at ganymede:~# date -s"20121028 00:00"; date; TZ=CET date
   Sun Oct 28 00:00:00 UTC 2012
   Sun Oct 28 00:00:04 UTC 2012
   Sun Oct 28 02:00:12 CEST 2012

Then I run the script, after setting TZ :

   fm at ganymede:~$ TZ=CET ./test_tz.py
   t = DateTime.now() :  2012-10-28 02:01:31.54
   t.gmtoffset  01:00:00.00
   t.gmtime  2012-10-28 01:01:31.54

t is ok, but gmtoffset is wrong, and so does gmtime.

So at the same system (UTC) time 20121028 00:01, DateTime gives two different
answers (in one case, the script has been launched on UTC 20121027,
DateTime gives correct result ref [1];  if the script is launched on UTC 20121028 00:00,
DateTime gives bogus results for gmtime and gmtoffset.

This is not specific to CET, I tested with TZ=EST5DST :

   ------------------------------------------------
   t = DateTime.now() :  2012-11-04 01:59:59.25
   t.gmtoffset  -04:00:00.00
   t.gmtime  2012-11-04 05:59:59.25

   ------------------------------------------------
   t = DateTime.now() :  2012-11-04 01:00:04.26
   t.gmtoffset  -04:00:00.00
   t.gmtime  2012-11-04 05:00:04.26

bogus, gmtime jumped backward, gmtoffset is wrong.

   ------------------------------------------------
   t = DateTime.now() :  2012-11-04 01:00:09.26
   t.gmtoffset  -04:00:00.00
   t.gmtime  2012-11-04 05:00:09.26

and one hour later :

   ------------------------------------------------
   t = DateTime.now() :  2012-11-04 01:59:58.81
   t.gmtoffset  -04:00:00.00
   t.gmtime  2012-11-04 05:59:58.81

Stil bogus and finally :

   ------------------------------------------------
   t = DateTime.now() :  2012-11-04 02:00:03.81
   t.gmtoffset  -05:00:00.00
   t.gmtime  2012-11-04 07:00:03.81

back to normal, gmtime jumping one hour forward.

(By the way, gmtime and gmtoffset two should read utctime 
and utcoffset).

Any idea on what's going on ?

Thank you in advance.

Regards,
-- 
François Meyer    Tel : (+33) 3 81 66 69 27   Mob : 6 27 28 56 83
Observatoire de Besancon - BP1615 - 25010 Besancon cedex - FRANCE
Institut UTINAM * Universite de Franche-Comte * CNRS UMR 6213 ***


More information about the egenix-users mailing list