datetime in microseconds

mroeloffs at gmail.com mroeloffs at gmail.com
Mon Aug 20 10:58:42 EDT 2007


On Aug 20, 4:17 pm, mroelo... at gmail.com wrote:
> On Aug 20, 3:15 pm, John Machin <sjmac... at lexicon.net> wrote:
>
>
>
> > On Aug 20, 9:52 pm, mroelo... at gmail.com wrote:
>
> > > Hi I have a time in microseconds, for example 0x8C905CBA7F84AF4. I
> > > want this to a normal view in hh:mm:ss DD:MM:YYYY. I tried with
> > > datetime, but it only takes a max of 1000000 microseconds is there
> > > another solution?
>
> > Your question can be interpreted in two possible ways:
>
> > 1. You have an interval or duration (independent of a calendar point)
> > and you want to express it in years, months, days, hours, etc. This is
> > not possible, due to the variable number of days in a month. The best
> > that you can do is express it as days, hours, etc.
>
> > >>> microsecs = 0x8C905CBA7F84AF4
> > >>> secs = microsecs // 1000000 # or round to nearest if you prefer
> > >>> mins, secs = divmod(secs, 60)
> > >>> hrs, mins = divmod(mins, 60)
> > >>> days, hrs = divmod(hrs, 24)
> > >>> days, hrs, mins, secs
>
> > (7326893L, 11L, 1L, 16L)
>
> > 2. You want to know the (Gregorian) calendar point that is
> > 0x8C905CBA7F84AF4 microseconds after some epoch. In this case you need
> > to specify what the epoch is. Then you can try something like:
>
> > >>> datetime.datetime.fromordinal(1) + datetime.timedelta(microseconds=microsecs
>
> > )
> > Traceback (most recent call last):
> >   File "<stdin>", line 1, in <module>
> > OverflowError: date value out of range
>
> > >>> # Whoops!
> > >>> years_approx = days / 365.25
> > >>> years_approx
> > 20059.939767282682
>
> > Hmmm, one of us seems to be missing something ...
>
> Sorry,  sorry, sorry it was the wrong value, it should be
> 0xE0E6FAC3FF3AB2.

The solution I made, with thanks to John. Maybe someone a better one??
    def DecodeDateTime(self,dateTime):
        dateTime = self.Rotate(dateTime)
        microsecs = int(hexlify(dateTime),16)
        microsecs -= 31536000000000           # -1 Year
        microsecs -= 1123200000000            # -13 Days (magic?)
        secs = microsecs // 1000000
        mins, secs = divmod(secs, 60)
        hrs, mins = divmod(mins, 60)
        days, hrs = divmod(hrs, 24)
        timed = datetime.datetime.fromordinal(1) +
datetime.timedelta(days)
        return "%02d-%02d-%02d %02d:%02d:%02d"%(timed.day,
timed.month, timed.year, hrs, mins, secs)




More information about the Python-list mailing list