def _datetime_from_str(time_str):
"""Return (<scope>, <datetime.datetime() instance>) for the given
datetime string.
>>> _datetime_from_str("2009")
('year', datetime.datetime(2009, 1, 1, 0, 0))
>>> _datetime_from_str("2009-12")
('month', datetime.datetime(2009, 12, 1, 0, 0))
>>> _datetime_from_str("2009-12-25")
('day', datetime.datetime(2009, 12, 25, 0, 0))
>>> _datetime_from_str("2009-12-25 13")
('hour', datetime.datetime(2009, 12, 25, 13, 0))
>>> _datetime_from_str("2009-12-25 13:05")
('minute', datetime.datetime(2009, 12, 25, 13, 5))
>>> _datetime_from_str("2009-12-25 13:05:14")
('second', datetime.datetime(2009, 12, 25, 13, 5, 14))
>>> _datetime_from_str("2009-12-25 13:05:14.453728")
('microsecond', datetime.datetime(2009, 12, 25, 13, 5, 14, 453728))
"""
import time
import datetime
formats = [
# <scope>, <pattern>, <format>
("year", "YYYY", "%Y"),
("month", "YYYY-MM", "%Y-%m"),
("day", "YYYY-MM-DD", "%Y-%m-%d"),
("hour", "YYYY-MM-DD HH", "%Y-%m-%d %H"),
("minute", "YYYY-MM-DD HH:MM", "%Y-%m-%d %H:%M"),
("second", "YYYY-MM-DD HH:MM:SS", "%Y-%m-%d %H:%M:%S"),
# ".<microsecond>" at end is manually handled below
("microsecond", "YYYY-MM-DD HH:MM:SS", "%Y-%m-%d %H:%M:%S"),
]
for scope, pattern, format in formats:
if scope == "microsecond":
# Special handling for microsecond part. AFAIK there isn't a
# strftime code for this.
if time_str.count('.') != 1:
continue
time_str, microseconds_str = time_str.split('.')
try:
microsecond = int((microseconds_str + '000000')[:6])
except ValueError:
continue
try:
# This comment here is the modern way. The subsequent two
# lines are for Python 2.4 support.
#t = datetime.datetime.strptime(time_str, format)
t_tuple = time.strptime(time_str, format)
t = datetime.datetime(*t_tuple[:6])
except ValueError:
pass
else:
if scope == "microsecond":
t = t.replace(microsecond=microsecond)
return scope, t
else:
raise ValueError("could not determine date from %r: does not "
"match any of the accepted patterns ('%s')"
% (time_str, "', '".join(s for s,p,f in formats)))
Diff to Previous Revision
--- revision 1 2010-03-21 21:38:48
+++ revision 2 2010-04-02 07:32:17
@@ -38,7 +38,7 @@
continue
time_str, microseconds_str = time_str.split('.')
try:
- microsecond = int(microseconds_str)
+ microsecond = int((microseconds_str + '000000')[:6])
except ValueError:
continue
try: