good ways to convert string into time

Bengt Richter bokr at oz.net
Tue Nov 18 18:44:47 EST 2003


On 18 Nov 2003 09:58:08 -0800, soundwave56 at 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




More information about the Python-list mailing list