def iso_time_string(val, show_tzinfo=False): """ Takes either a date, datetime or a string, and returns the standard ISO formatted string for that date/time, with any fractional second portion removed. """ if not val: return "" if isinstance(val, basestring): dt = None for fmt in ("%Y-%m-%d %H:%M:%S", "%Y-%m-%d"): try: dt = datetime.datetime.strptime(val, fmt) break except ValueError: continue if dt is None: raise exc.InvalidDateTimeString("The supplied value '%s' does not " "match either of the formats 'YYYY-MM-DD HH:MM:SS' or " "'YYYY-MM-DD'." % val) else: dt = val if not isinstance(dt, datetime.datetime): dt = datetime.datetime.fromordinal(dt.toordinal()) has_tz = (dt.tzinfo is not None) if show_tzinfo and has_tz: # Need to remove the colon in the TZ portion ret = "".join(dt.isoformat().rsplit(":", 1)) elif show_tzinfo and not has_tz: ret = "%s+0000" % dt.isoformat().split(".")[0] elif not show_tzinfo and has_tz: ret = dt.isoformat()[:-6] elif not show_tzinfo and not has_tz: ret = dt.isoformat().split(".")[0] return ret
def _parse_datetime_string(val): """ Attempts to parse a string representation of a date or datetime value, and returns a datetime if successful. If not, a InvalidDateTimeString exception will be raised. """ dt = None lenval = len(val) fmt = {19: "%Y-%m-%d %H:%M:%S", 10: "%Y-%m-%d"}.get(lenval) if fmt is None: # Invalid date raise exc.InvalidDateTimeString("The supplied value '%s' does not " "match either of the formats 'YYYY-MM-DD HH:MM:SS' or " "'YYYY-MM-DD'." % val) return datetime.datetime.strptime(val, fmt)