Vernon Cole wrote:

> Dear raf:
>   Yes, time zones in the python time module are known to be somewhat messed
> up.  Mark Hammond and I went several rounds while trying to create a test
> for the "python time" capabilities in adodbapi.  When a test worked for me
> in North America, it was almost guaranteed to fail for him in antipodes.

that's sad :-( time.localtime() should effectively just be a tiny
wrapper around the standard C library function, localtime(), and my
demonstration code works fine for everyone else but me so i don't think
this is a problem with python's time module or the standard C library.
it's more likely to be some wierdness with these windows hosts in
particular. or cosmic rays. or higgs bosons. :-)

> The problems seem to be deep in the standard library code.  We finally
> concluded that we would just document the problems with "time" and suggest
> that everyone use "datetime", which is considerably more capable. Time zone
> aware datetime objects seemed to work perfectly. (Are you _sure_ that
> datetime.datetime.now() was messing up in your situation?)

yes, i'm sure. that's how i noticed these issues in the first place. logfiles
with timestamps jumping backwards and forwards many hours several times a day.
the timestamps came from datetime.datetime.now().isoformat('T').

>  Jason Coombs contributed the "win32timezone" module to pywin32 which makes
> use of the extensive time zone support in the Windows registry.   Look it
> up in your pywin32 documentation. You might be especially interested in
> win32timezone.now().   If I understand what you are looking for, the return
> value of win32api.GetTimeZoneInformation() might give you the correct
> answer.
> 
>   So, in answer to your question "how to fix it", I would suggest that you
> start with:
> >>>import win32timezone, datetime
> 
> Please report back if that does not work.
> --
> Vernon Cole

the following code:

  #!/usr/bin/env python
  import win32api, win32con, win32timezone, datetime, time
  print('GetTimeZoneInformation = %r' % (win32api.GetTimeZoneInformation(),))
  print('TIME_ZONE_ID_STANDARD = %r' % win32con.TIME_ZONE_ID_STANDARD)
  print('TIME_ZONE_ID_DAYLIGHT = %r' % win32con.TIME_ZONE_ID_DAYLIGHT)
  print('TIME_ZONE_ID_UNKNOWN = %r' % win32con.TIME_ZONE_ID_UNKNOWN)
  print('win32timezone.now = %r' % win32timezone.now())
  print('datetime.now = %r' % datetime.datetime.now())
  print('localtime = %r' % time.localtime())

produces:

  GetTimeZoneInformation = (1, (-600, u'AUS Eastern Standard Time',
    <PyTime:1/04/2000 3:00:00 AM>, 0, u'AUS Eastern Daylight Time',
    <PyTime:1/10/2000 2:00:00 AM>, -60))
  TIME_ZONE_ID_STANDARD = 1
  TIME_ZONE_ID_DAYLIGHT = 2
  TIME_ZONE_ID_UNKNOWN = 0
  win32timezone.now = datetime.datetime(2012, 7, 26, 19, 47, 54, 235000,
    tzinfo=TimeZoneInfo(u'AUS Eastern Standard Time'))
  datetime.now = datetime.datetime(2012, 7, 26, 10, 47, 54, 235000)
  localtime = time.struct_time(tm_year=2012, tm_mon=7, tm_mday=26,
    tm_hour=10, tm_min=47, tm_sec=54, tm_wday=3, tm_yday=208, tm_isdst=1)

so that does work when datetime.datetime.now() and time.localtime() don't.

i've already replaced all uses of datetime.datetime.now() and time.localtime()
with code to get the local time from a nearby linux host when necessary
but i can change that to use the above methods.

Many thanks,
raf

> On Wed, Jul 25, 2012 at 12:00 AM, <r...@raf.org> wrote:
> 
> > hi,
> >
> > i've just noticed the following wierdness with the time and datetime
> > modules
> > (python-2.6.2 and python-2.7.3) on three windows7 hosts and one windowsxp
> > host (but not another xp host) and i'm wondering if anyone else has
> > encountered this and knows how to fix it.
> >
> > the first problem is that time.timezone contains 0 instead of
> > the usual -36000 (for Australia/Sydney).
> >
> > the second problem is that time.localtime(...).is_dst is wrong.
> > time.tzname is also wrong but i care less about that.
> >
> > the demonstration code and output is below. i can fake the
> > time.timezone being absent but i can't see any good way to
> > deal with localtime not knowing when it's daylight savings.
> > it appears to think it's DST when it isn't and vice versa.
> >
> > this all worked before the upgrades to the new windows7 hosts.
> > the xp host that also exhibits the problem has recently had
> > its PSU, MB, CPU and RAM replaced but the HDD remains the same.
> > the xp host that doesn't exhibit the problem has all old hardware.
> > so the common factor seems to be new hardware rather than
> > specifically windows7.
> >
> > the third problem is that datetime.datetime.now() (and time.strftime() and
> > time.localtime() and presumably time.time()) don't always return the
> > current time. sometimes they do. sometimes the "current time" jumps back
> > usually 9 hours for a while and then returns to normal. note that the
> > current time that windows displays to the user is always correct. it's just
> > python's idea of the current time that is wrong.
> >
> > all hosts have the correct timezone (i.e. Australia/Sydney or rather
> > "(GMT +10:00) Canberra, Melbourne, Sydney" with automatic DST adjustment)
> > and automatic time synchronisation.
> >
> > all hosts have the hardware clock in the local timezone and windows
> > doesn't have the RealTimeIsUniversal=1 registry entry so it knows
> > that the hardware clock is in the local timezone. so there's no
> > confusion there.
> >
> > any help would be appreciated.
> >
> > cheers,
> > raf
> >
> > #!/usr/bin/env python
> > import time
> > print('time.timezone = %r (should be -36000)' % time.timezone)
> > print('time.tzname = %r (should be (\'EST\', \'EST\' or similar))' %
> > (time.tzname,))
> > print('dst in june = %r (should be 0 (for Australia/Sydney))' %
> > time.localtime(time.mktime((2012, 6, 1, 0, 0, 0, 0, 0, -1))).tm_isdst)
> > print('dst in december = %r (should be 1 (for Australia/Sydney))' %
> > time.localtime(time.mktime((2012, 12, 1, 0, 0, 0, 0, 0, -1))).tm_isdst)
> >
> > # Windows XP Professional Service Pack 3 (correct)
> > # time.timezone = -36000 (should be -36000)
> > # time.tzname = ('AUS Eastern Standard Time', 'AUS Eastern Daylight Time')
> > (should be ('EST', 'EST') or similar)
> > # dst in june = 0 (should be 0 (for Australia/Sydney))
> > # dst in december = 1 (should be 1 (for Australia/Sydney))
> >
> > # Windows 7 and Windows XP Professional Service Pack 3 (incorrect)
> > # time.timezone = 0 (should be -36000)
> > # time.tzname = ('Aus', 'tra') (should be ('EST', 'EST') or similar)
> > # dst in june = 1 (should be 0 (for Australia/Sydney))
> > # dst in december = 0 (should be 1 (for Australia/Sydney))
_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to