Fix for datetime conversion to integer and back to string; was 1 hour off
La Uruguaya
lacuidadanadelmundo at yahoo.com
Mon Apr 28 14:31:24 EDT 2003
I searched this group for a solution to a problem I had converting
dates from a string format to integer (in seconds since 1970) and back
to strings. During some times of the year, the conversion didn't do
a perfect round trip and I ended up with a datetime that differed from
the original datetime by one hour. I found 2 postings with variations
on the problem, but not a solution. I implemented the following
solution and wanted to share it in case somebody needs it later.
import time
DATE_FORMAT = "%Y/%m/%d %H:%M:%S"
def date2int(strdate):
result = 0
try:
tuple = time.strptime(strdate, DATE_FORMAT)
result = time.mktime(time.strptime(strdate, DATE_FORMAT))
except:
pass
return (result, tuple)
def correctForDaytime(tup):
lst = list(tup)
lst[3] -= tup[-1] # if this is zero, then this is a no op
lst[-1] = 0
return tuple(lst)
def int2date(intdate):
result = ''
if intdate > 0:
try:
tuple = time.localtime(intdate)
tuple = correctForDaytime(tuple) # commenting this line out
will show you the bug
result = time.strftime(DATE_FORMAT, tuple)
except:
pass
return (result, tuple)
def f(t1str):
(t1int, tup1) = date2int(t1str)
(t1str2, tup2) = int2date(t1int)
print t1str, "->", t1int
print t1int, "->", t1str2
if tup1 == tup2:
print "SAME", tup1, tup2
else:
print "DIFF", tup1, tup2
if t1str != t1str2:
print "FAILED", t1str, t1str2
else:
print "OK"
f("2003/01/15 11:15:00")
f("2003/02/15 11:15:00")
f("2003/03/15 11:15:00")
f("2003/04/15 11:15:00")
f("2003/05/15 11:15:00")
f("2003/06/15 11:15:00")
f("2003/07/15 11:15:00")
f("2003/08/15 11:15:00")
f("2003/09/15 11:15:00")
f("2003/10/15 11:15:00")
f("2003/11/15 11:15:00")
f("2003/12/15 11:15:00")
f("2003/01/03 11:15:00")
f("2003/02/03 11:15:00")
f("2003/03/03 11:15:00")
f("2003/04/03 11:15:00")
f("2003/05/03 11:15:00")
f("2003/06/03 11:15:00")
f("2003/07/03 11:15:00")
f("2003/08/03 11:15:00")
f("2003/09/03 11:15:00")
f("2003/10/03 11:15:00")
f("2003/11/03 11:15:00")
f("2003/12/03 11:15:00")
f("2003/01/27 11:15:00")
f("2003/02/27 11:15:00")
f("2003/03/27 11:15:00")
f("2003/04/27 11:15:00")
f("2003/05/27 11:15:00")
f("2003/06/27 11:15:00")
f("2003/07/27 11:15:00")
f("2003/08/27 11:15:00")
f("2003/09/27 11:15:00")
f("2003/10/27 11:15:00")
f("2003/11/27 11:15:00")
f("2003/12/27 11:15:00")
More information about the Python-list
mailing list