util.strdate: compute timestamp using UTC, not local timezone
authorJose M. Prieto <jmprieto@gmx.net>
Tue, 03 Oct 2006 12:33:14 +0200
changeset 3255 e96d2956eb4a
parent 3243 1d3aceae87c1
child 3256 e5c9a084ffe3
util.strdate: compute timestamp using UTC, not local timezone
mercurial/util.py
tests/test-parse-date
tests/test-parse-date.out
--- a/mercurial/util.py	Tue Oct 03 16:36:40 2006 -0700
+++ b/mercurial/util.py	Tue Oct 03 12:33:14 2006 +0200
@@ -15,7 +15,7 @@
 from i18n import gettext as _
 from demandload import *
 demandload(globals(), "cStringIO errno getpass popen2 re shutil sys tempfile")
-demandload(globals(), "os threading time")
+demandload(globals(), "os threading time calendar")
 
 # used by parsedate
 defaultdateformats = ('%Y-%m-%d %H:%M:%S', '%Y-%m-%d %H:%M',
@@ -903,14 +903,16 @@
                (string[-5] == '+' or string[-5] == '-') and
                string[-6].isspace())
 
+    # NOTE: unixtime = localunixtime + offset
     if hastimezone(string):
         date, tz = string[:-6], string[-5:]
         tz = int(tz)
         offset = - 3600 * (tz / 100) - 60 * (tz % 100)
     else:
         date, offset = string, 0
-    when = int(time.mktime(time.strptime(date, format))) + offset
-    return when, offset
+    localunixtime = int(calendar.timegm(time.strptime(date, format)))
+    unixtime = localunixtime + offset
+    return unixtime, offset
 
 def parsedate(string, formats=None):
     """parse a localized time string and return a (unixtime, offset) tuple.
--- a/tests/test-parse-date	Tue Oct 03 16:36:40 2006 -0700
+++ b/tests/test-parse-date	Tue Oct 03 12:33:14 2006 +0200
@@ -1,5 +1,6 @@
 #!/bin/sh
 
+# This runs with TZ="GMT"
 hg init
 echo "test-parse-date" > a
 hg add a
@@ -13,4 +14,21 @@
 hg ci -d "should fail" -m "fail"
 hg ci -d "100000000000000000 1400" -m "fail"
 hg ci -d "100000 1400000" -m "fail"
+
+# Check with local timezone other than GMT and with DST
+TZ="PST+8PDT"
+export TZ
+# PST=UTC-8 / PDT=UTC-7
+hg debugrebuildstate
+echo "a" > a
+hg ci -d "2006-07-15 13:30" -m "summer@UTC"
+hg debugrebuildstate
+echo "b" > a
+hg ci -d "2006-07-15 13:30 +0500" -m "summer@UTC+5"
+hg debugrebuildstate
+echo "c" > a
+hg ci -d "2006-01-15 13:30" -m "winter@UTC"
+hg debugrebuildstate
+echo "d" > a
+hg ci -d "2006-01-15 13:30 +0500" -m "winter@UTC+5"
 hg log --template '{date|date}\n'
--- a/tests/test-parse-date.out	Tue Oct 03 16:36:40 2006 -0700
+++ b/tests/test-parse-date.out	Tue Oct 03 12:33:14 2006 +0200
@@ -12,6 +12,10 @@
 abort: impossible time zone offset: 1400000
 transaction abort!
 rollback completed
+Sun Jan 15 13:30:00 2006 +0500
+Sun Jan 15 13:30:00 2006 +0000
+Sat Jul 15 13:30:00 2006 +0500
+Sat Jul 15 13:30:00 2006 +0000
 Sun Jun 11 00:26:40 2006 -0400
 Sat Apr 15 13:30:00 2006 +0200
 Sat Apr 15 13:30:00 2006 +0000