[Python-checkins] r84953 - in python/branches/py3k/Lib: datetime.py test/datetimetester.py

alexander.belopolsky python-checkins at python.org
Tue Sep 21 18:30:56 CEST 2010


Author: alexander.belopolsky
Date: Tue Sep 21 18:30:56 2010
New Revision: 84953
Log:
Fixed microsecond rounding in python version of utcfromtimestamp
Modified:
 python/branches/py3k/Lib/datetime.py
 python/branches/py3k/Lib/test/datetimetester.py
Modified: python/branches/py3k/Lib/datetime.py
==============================================================================
--- python/branches/py3k/Lib/datetime.py	(original)
+++ python/branches/py3k/Lib/datetime.py	Tue Sep 21 18:30:56 2010
@@ -1379,12 +1379,17 @@
 @classmethod
 def utcfromtimestamp(cls, t):
 "Construct a UTC datetime from a POSIX timestamp (like time.time())."
- if 1 - (t % 1.0) < 0.000001:
- t = float(int(t)) + 1
- if t < 0:
- t -= 1
+ t, frac = divmod(t, 1.0)
+ us = round(frac * 1e6)
+
+ # If timestamp is less than one microsecond smaller than a
+ # full second, us can be rounded up to 1000000. In this case,
+ # roll over to seconds, otherwise, ValueError is raised
+ # by the constructor.
+ if us == 1000000:
+ t += 1
+ us = 0
 y, m, d, hh, mm, ss, weekday, jday, dst = _time.gmtime(t)
- us = int((t % 1.0) * 1000000)
 ss = min(ss, 59) # clamp out leap seconds if the platform has them
 return cls(y, m, d, hh, mm, ss, us)
 
Modified: python/branches/py3k/Lib/test/datetimetester.py
==============================================================================
--- python/branches/py3k/Lib/test/datetimetester.py	(original)
+++ python/branches/py3k/Lib/test/datetimetester.py	Tue Sep 21 18:30:56 2010
@@ -1729,10 +1729,10 @@
 def test_microsecond_rounding(self):
 # Test whether fromtimestamp "rounds up" floats that are less
 # than 1/2 microsecond smaller than an integer.
- self.assertEqual(self.theclass.fromtimestamp(0.9999999),
- self.theclass.fromtimestamp(1))
- self.assertEqual(self.theclass.fromtimestamp(0.99999949).microsecond,
- 999999)
+ for fts in [self.theclass.fromtimestamp,
+ self.theclass.utcfromtimestamp]:
+ self.assertEqual(fts(0.9999999), fts(1))
+ self.assertEqual(fts(0.99999949).microsecond, 999999)
 
 def test_insane_fromtimestamp(self):
 # It's possible that some platform maps time_t to double,


More information about the Python-checkins mailing list

AltStyle によって変換されたページ (->オリジナル) /