+#----------------------------------------------------------------------------
+# Name: datetimeparser.py
+#
+# Purpose: - Instantiate datetime.datetime/date instance from a string
+# date representation.
+# Uses dateutil from http://labix.org/python-dateutil.
+#
+# - Creates string representation of datetime/date instance.
+#
+#
+# Author: Simon Toens
+#
+# Created: 28-Feb-06
+# CVS-ID:
+# Copyright: (c) 2005 ActiveGrid, Inc.
+# License: wxWindows License
+#----------------------------------------------------------------------------
+
+import datetime
+
+try:
+ import dateutil.parser
+ DATEUTIL_INSTALLED = True
+except ImportError:
+ DATEUTIL_INSTALLED = False
+
+ISO_8601_DATE_FORMAT = "%Y-%m-%d"
+ISO_8601_TIME_FORMAT = "%H:%M:%S"
+ISO_8601_DATETIME_FORMAT = "%s %s" %(ISO_8601_DATE_FORMAT,
+ ISO_8601_TIME_FORMAT)
+
+DEFAULT_DATETIME = datetime.datetime(1, 1, 1, 0, 0, 0, 0)
+
+
+def format(dateobj, formatstr=None):
+ if (formatstr != None and _isDateTimeObject(dateobj)):
+ return dateobj.strftime(str(formatstr))
+ return str(dateobj)
+
+
+def parse(datestr, formatstr=None, asdate=False, astime=False):
+ """Instantiates and returns a datetime instance from the datestr datetime
+ representation.
+
+ Optionally, a format string may be used. The format is only loosely
+ interpreted, its only purpose beeing to determine if the year is first
+ or last in datestr, and whether the day is in front or follows the
+ month. If no formatstr is passed in, dateutil tries its best to parse
+ the datestr. The default date format is YYYY-mm-dd HH:SS.
+
+ If asdate is True, returns a date instance instead of a datetime
+ instance, if astime is True, returns a time instance instead of a
+ datetime instance."""
+
+
+ dayfirst, yearfirst = _getDayFirstAndYearFirst(formatstr)
+
+ rtn = None
+
+ try:
+ if DATEUTIL_INSTALLED:
+ rtn = dateutil.parser.parse(str(datestr), fuzzy=True,
+ dayfirst=dayfirst, yearfirst=yearfirst,
+ default=DEFAULT_DATETIME)
+ else:
+ rtn = DEFAULT_DATETIME
+ except:
+ rtn = DEFAULT_DATETIME
+
+ if (asdate and isinstance(rtn, datetime.datetime)):
+ rtn = datetime.date(rtn.year, rtn.month, rtn.day)
+ elif (astime and isinstance(rtn, datetime.datetime)):
+ rtn = datetime.time(rtn.hour, rtn.minute, rtn.second, rtn.microsecond)
+
+ return rtn
+
+
+def _isDateTimeObject(obj):
+ return (isinstance(obj, datetime.datetime) or
+ isinstance(obj, datetime.date) or
+ isinstance(obj, datetime.time))
+
+
+def _getDayFirstAndYearFirst(formatstr):
+ dayFirst = False
+ yearFirst = False
+
+ gotYear = False
+ gotMonth = False
+ gotDay = False
+
+ if (formatstr == None):
+ formatstr = ""
+
+ for c in formatstr:
+ if (c.lower() == "y"):
+ if (gotYear):
+ continue
+ if (not gotDay and not gotMonth):
+ yearFirst = True
+ gotYear = True
+
+ elif (c.lower() == "m"):
+ if (gotMonth):
+ continue
+ if (not gotDay):
+ dayFirst = False
+ gotMonth = True
+
+ elif (c.lower() == "d"):
+ if (gotDay):
+ continue
+ if (not gotMonth):
+ dayFirst = True
+ gotDay = True
+
+
+ return dayFirst, yearFirst