summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorniemeyer <>2007-11-05 00:50:23 +0000
committerniemeyer <>2007-11-05 00:50:23 +0000
commitc52a13d7d3057f33b98d25db7be14cefef88393f (patch)
treef866d4e838db129cf4a1ba243bd74aa180535965
parent2702259f864e6ecf787b47cdfd0e7a220f4f76a6 (diff)
downloaddateutil-c52a13d7d3057f33b98d25db7be14cefef88393f.tar.gz
Fixed precision problem on conversion of decimal seconds to
microseconds, as reported by Skip Montanaro.
-rw-r--r--dateutil/parser.py16
-rw-r--r--test.py8
2 files changed, 15 insertions, 9 deletions
diff --git a/dateutil/parser.py b/dateutil/parser.py
index 5f25a4d..afa52a8 100644
--- a/dateutil/parser.py
+++ b/dateutil/parser.py
@@ -387,9 +387,7 @@ class parser:
res.hour = int(s[:2])
res.minute = int(s[2:4])
value = float(s[4:])
- res.second = int(value)
- if value%1:
- res.microsecond = int(1000000*(value%1))
+ res.second, res.microsecond = _parsems(value)
elif len_li == 8:
# YYYYMMDD
s = l[i-1]
@@ -423,9 +421,7 @@ class parser:
if value%1:
res.second = int(60*(value%1))
elif idx == 2:
- res.second = int(value)
- if value%1:
- res.microsecond = int(1000000*(value%1))
+ res.second, res.microsecond = _parsems(value)
i += 1
if i >= len_l or idx == 2:
break
@@ -452,9 +448,7 @@ class parser:
i += 1
if i < len_l and l[i] == ':':
value = float(l[i+1])
- res.second = int(value)
- if value%1:
- res.microsecond = int(1000000*(value%1))
+ res.second, res.microsecond = _parsems(value)
i += 2
elif i < len_l and l[i] in ('-', '/', '.'):
sep = l[i]
@@ -872,4 +866,8 @@ DEFAULTTZPARSER = _tzparser()
def _parsetz(tzstr):
return DEFAULTTZPARSER.parse(tzstr)
+def _parsems(value):
+ return int(value), int(value * 1000000) - int(value) * 1000000
+
+
# vim:ts=4:sw=4:et
diff --git a/test.py b/test.py
index 8407029..3150e82 100644
--- a/test.py
+++ b/test.py
@@ -3548,6 +3548,14 @@ class ParserTest(unittest.TestCase):
self.assertEqual(parse(dt.isoformat()), dt)
dt += delta
+ def testMicrosecondsPrecisionError(self):
+ # Skip found out that sad precision problem. :-(
+ dt1 = parse("00:11:25.01")
+ dt2 = parse("00:12:10.01")
+ self.assertEquals(dt1.microsecond, 10000)
+ self.assertEquals(dt2.microsecond, 10000)
+
+
class EasterTest(unittest.TestCase):
easterlist = [
# WESTERN ORTHODOX