On 18 Nov 2003 09:58:08 -0800,
so*********@yahoo.ca (Hank) wrote:
hi,
i have a string as follows
18Nov2003:18:23:43:405
Is there an easy way to convert that to absolute time? What i really
want to do is to parse these times from a log file and do time
comparisons, averages, stop minus start (elapsed).
Probably create my own conversion table i guess?
thanks
Quick and dirty using the time module (and re to split your string)
Not tested beyond what your see here!
====< s2t.py >==================
import time,re
rxo = re.compile(r'(\d+)([a-zA-Z]+)(\d+):(\d+):(\d+):(\d+):(\d+)')
monthnums = dict([(mo,i+1) for i,mo in enumerate(
'Jan Feb Mar Apr May Jun Jul Aug Sep Oct Nov Dec'.split())])
def s2t(s, dst=-1): # guess daylight svgs
da,mo,yr,hr,min,sec,ms = rxo.search(s).groups()
mo = monthnums[mo]
tinfo = map(int, (yr,mo,da,hr,min,sec,ms))
ms = tinfo.pop()
return time.mktime(tinfo+[0,0,dst])+ms/1000.0
================================
import s2t
s2t.s2t('18Nov2003:18:23:43:405')
1069208623.405 import time
time.ctime(s2t.s2t('18Nov2003:18:23:43:405'))
'Tue Nov 18 18:23:43 2003'
IOW, s2t converts your time info to a floating point number in seconds from the epoch,
which e.g., time.ctime and other time functions can use.
The milliseconds (I assumed) are ignored by ctime, but I tacked them on in the number returned.
(Note that floating point won't represent all decimals accurately, but it should be good rounded
to ms, e.g.,
from ut.exactdec import ED
ED(s2t.s2t('18Nov2003:18:23:43:405'),'all')
ED('1069208623.4049999713897705078125')
That's all the bit info. Looks like a good four 9's below your ms unit.
ED(s2t.s2t('18Nov2003:18:23:43:405'),'all').round( 3)
ED('1069208623.405')
PS. I think there is a bug in time.mktime -- I accidentally got it trying to find time zero:
s2t.s2t('01Jan1970:00:00:00:000', 1)
25200.0 s2t.s2t('31Dec1969:23:00:00:000', 1)
21600.0 s2t.s2t('31Dec1969:17:00:00:000', 1)
0.0 s2t.s2t('31Dec1969:17:00:00:000', 0)
3600.0 s2t.s2t('31Dec1969:17:00:00:000', 1)
0.0 s2t.s2t('31Dec1969:16:00:00:000', 1)
(boom)
I got:
The instruction at "0x7802a7ff" referenced memory at "0x00000000". The memory
could not be "read".
That shouldn't happen no matter what garbage I type as args, ISTM ;-/
Guess I'll post a plainer mktime example separately.
Regards,
Bengt Richter