--- 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