[Tutor] timedelta, difference calculation

Lie Ryan lie.1296 at gmail.com
Mon Dec 12 22:14:28 CET 2011


On 12/13/2011 06:46 AM, rail shafigulin wrote:
> i found something interesting during the timedate difference calculation
>
> import datetime
> import time
>
> def main():
>    mydatetime = datetime.datetime.now()
>    time.sleep(1)
>    mydatetime2 = datetime.datetime.now()
>    diff = mydatetime - mydatetime2
>
>    print(diff)
>
> if __name__ == '__main__':
>    main()
>
> if you run this code the result you get will be
> -1 day, 23:59:59
>
> at least that is what i'm getting.
>
> i was expecting to get -1 second. diff object is of type timedelta. this
> kind of objects represent duration, at least that is what i understood
> from the documentation
> (http://docs.python.org/release/3.1.3/library/datetime.html#timedelta-objects).
> so, is this a bug in the timedelta implementation or is it me not
> understanding documentation properly?

It's due to timedelta normalization; in timedelta object only the day 
part is ever negative, you never had negative hour, minute, or second. 
The `-1 day, 23:59:59` means to subtract 1 day, then add 23:59:59; 
therefore giving us -1 second.

It is documented behavior, although perhaps hinted too subtly, from the 
docs:

"""
Note that normalization of negative values may be surprising at first. 
For example,

 >>> from datetime import timedelta
 >>> d = timedelta(microseconds=-1)
 >>> (d.days, d.seconds, d.microseconds)
(-1, 86399, 999999)
"""



More information about the Tutor mailing list