A blog about things I do: Debian, Linux, Python, whatever
2010-12-28
Convert a date to epoch
it seems like an easy quest, ain't it? well, it took me far too long to get it done, so let just write it down, so that maybe I won't forget in 2 seconds:
>>> import time >>> str = '2009-03-04' >>> format = '%Y-%m-%d' >>> time.mktime(time.strptime(str, format)) 1236121200.0 >>> int(_) 1236121200
and here you have your epoch (if you just need seconds, use int()).
Clearly the value for Jan 1, 1970 should be 0. The trouble is that mktime assumes a time tuple in localtime, whereas epoch offsets are always GMT or UTC. You need to adjust for your local timezone. This gets to be prohibitively complex as you desire more accuracy (for example, mktime(gmtime(0)) tells you how offset your local timezone was on Jan 1, 1970, but that's not necessarily the same as the offset for the actual date you're operating on - DST is a major (but not the only) factor in throwing that off).
Alternatively, `date -d'2009-03-04' '+%s'`
ReplyDeleteThis recipe is incorrect, sorry. :/
ReplyDeleteConsider this edge case and it becomes a bit more obvious:
>>> fmt = '%Y-%m-%d'
>>> str = '1970-01-01'
>>> mktime(strptime(str, fmt))
18000.0
>>>
Clearly the value for Jan 1, 1970 should be 0. The trouble is that mktime assumes a time tuple in localtime, whereas epoch offsets are always GMT or UTC. You need to adjust for your local timezone. This gets to be prohibitively complex as you desire more accuracy (for example, mktime(gmtime(0)) tells you how offset your local timezone was on Jan 1, 1970, but that's not necessarily the same as the offset for the actual date you're operating on - DST is a major (but not the only) factor in throwing that off).
overwriting python's built in types is very poor form. Try:
ReplyDeletes = '1970-01-01'
or:
string = '1970-01-01'
I also wanted a way to look up these conversions, so I made a more general tool:
ReplyDeletehttp://bigasterisk.com/python-date-convert/
I'm just adding what Joss suggested on IRC:
ReplyDelete>>> from datetime import datetime
>>> string = '2009-03-04'
>>> format = '%Y-%m-%d'
>>> datetime.strptime(string, format).strftime('%s')
'1236121200'
and here's the comment of Wayne Witzel at http://pieceofpy.com/2010/12/29/response-convert-date-to-epoch :
ReplyDelete>>> import time, calendar
>>> ts = time.strptime('2010-12-01', '%Y-%m-%d')
>>> calendar.timegm(ts)
1291161600
>>> ts = time.strptime('1970-01-01', '%Y-%m-%d')
>>> calendar.timegm(ts)
0
PS: thanks to all that have commented and/or criticizes the recipe :)