-#----------------------------------------------------------------------------
-# 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