Serializing / Unserializing datetime

John Machin sjmachin at lexicon.net
Sat May 27 19:52:20 EDT 2006


On 28/05/2006 3:37 AM, Brendan wrote:
> Hi All
> 
> I can't find the "Python Way" of writing a datetime instance to a
> string so that it can be easily parsed back again.  time.strptime is
> apparantly not supported on some platforms, and time.time <==>
> datetime.utcfromtimestamp will cause problems come 2038.  Unfortunately
> there don't seem to be "fromstring" equivalents for datetime.ctime or
> datetime.isoformat.
> 
> Ideally the serialized datetime should be human readable, and
> potentially parseable from other languages.  Any suggestions?
> 
>

It's not that hard to DIY; the simple code at the end of this posting 
(1) handles fractions of a second [which you may or may not want] 
without burdening the network or the readers' eyeballs with excess 
trailing zeroes (2) doesn't handle TZs [which you may or may not want].

Some further validation on input strings may be a good idea, if you need 
to eat other software's strings as well as yours. E.g. check that where 
the '-' characters should be that you find nothing stranger than '.' or 
'/'; certainly not digits.

HTH,
John

8<---
import datetime

def datetime_from_str(s):
     # YYYY-MM-DD HH:MM:SS.TTT
     # 01234567890123456789012
     year = int(s[0:4])
     month = int(s[5:7])
     day = int(s[8:10])
     hour = int(s[11:13])
     minute = int(s[14:16])
     microseconds = int(float(s[17:]) * 1000000.0)
     second, microsecond = divmod(microseconds, 1000000)
     return datetime.datetime(year, month, day, hour, minute, second, 
microsecond)

def datetime_as_str(dtm):
     part1 = dtm.strftime("%Y-%m-%d %H:%M:%S")
     micros = dtm.microsecond
     if not micros:
         return part1
     part2 = (".%06d" % micros).rstrip('0')
     return part1 + part2

if __name__ == "__main__":
     tests = [
         '1999-12-31 23:59:59.999999',
         '1999-12-31 23:59:59.99999999',
         '1999-12-31 23:59:59.999',
         '1999-12-31 23:59:59',
         '2000-01-01 00:00:00.000',
         '2000-01-01 00:00:00',
         '2000-01-01 00:00:00.000001',
         '2000-01-01 00:00:00.001',
         ]
     for test in tests:
         dtm = datetime_from_str(test)
         print "input str: ", repr(test)
         print "datetime:  ", repr(dtm)
         round_trip = datetime_as_str(dtm)
         print "output str:", repr(round_trip), ["not same", 
""][round_trip == test]
         print
8<---




More information about the Python-list mailing list