Mercurial > hg
changeset 15505:ae04af1ce78d stable
makedate: wrong timezone offset if DST rules changed this year (issue2511)
Python's time module sets timezone and altzone based on UTC offsets of
two dates: first and middle day of the current year. This approach
doesn't work on a year when DST rules change.
For example Russia abandoned winter time this year, so the correct UTC
offset should be +4 now, but time.timezone returns 3 hours difference
because that's what it was on 01.01.2011.
Related python issue: http://bugs.python.org/issue1647654
author | Dmitry Panov <dop@itoolabs.com> |
---|---|
date | Sun, 13 Nov 2011 00:29:26 +0000 |
parents | 58f96703a9ab |
children | dc9fb7015d7f |
files | mercurial/util.py |
diffstat | 1 files changed, 8 insertions(+), 10 deletions(-) [+] |
line wrap: on
line diff
--- a/mercurial/util.py Wed Nov 16 17:55:32 2011 -0600 +++ b/mercurial/util.py Sun Nov 13 00:29:26 2011 +0000 @@ -16,7 +16,7 @@ from i18n import _ import error, osutil, encoding import errno, re, shutil, sys, tempfile, traceback -import os, time, calendar, textwrap, signal +import os, time, datetime, calendar, textwrap, signal import imp, socket, urllib if os.name == 'nt': @@ -900,16 +900,14 @@ yield s def makedate(): - lt = time.localtime() - if lt[8] == 1 and time.daylight: - tz = time.altzone - else: - tz = time.timezone - t = time.mktime(lt) - if t < 0: + ct = time.time() + if ct < 0: hint = _("check your clock") - raise Abort(_("negative timestamp: %d") % t, hint=hint) - return t, tz + raise Abort(_("negative timestamp: %d") % ct, hint=hint) + delta = (datetime.datetime.utcfromtimestamp(ct) - + datetime.datetime.fromtimestamp(ct)) + tz = delta.days * 86400 + delta.seconds + return ct, tz def datestr(date=None, format='%a %b %d %H:%M:%S %Y %1%2'): """represent a (unixtime, offset) tuple as a localized time.