1.1 --- a/imiptools/content.py Sun Oct 26 17:51:04 2014 +0100
1.2 +++ b/imiptools/content.py Sun Oct 26 19:42:40 2014 +0100
1.3 @@ -91,11 +91,27 @@
1.4 else:
1.5 return dt
1.6
1.7 +def to_timezone(dt, name):
1.8 + try:
1.9 + tz = name and timezone(name) or None
1.10 + except UnknownTimeZoneError:
1.11 + tz = None
1.12 + if tz is not None:
1.13 + if not dt.tzinfo:
1.14 + return tz.localize(dt)
1.15 + else:
1.16 + return dt.astimezone(tz)
1.17 + else:
1.18 + return dt
1.19 +
1.20 def format_datetime(dt):
1.21 if not dt:
1.22 return None
1.23 elif isinstance(dt, datetime):
1.24 - return dt.strftime("%Y%m%dT%H%M%SZ")
1.25 + if dt.tzname() == "UTC":
1.26 + return dt.strftime("%Y%m%dT%H%M%SZ")
1.27 + else:
1.28 + return dt.strftime("%Y%m%dT%H%M%S")
1.29 else:
1.30 return dt.strftime("%Y%m%d")
1.31
1.32 @@ -105,13 +121,14 @@
1.33 def get_uri(value):
1.34 return value.startswith("mailto:") and value or "mailto:%s" % value
1.35
1.36 -def get_datetime(value, attr):
1.37 - try:
1.38 - tz = attr.has_key("TZID") and timezone(attr["TZID"]) or None
1.39 - except UnknownTimeZoneError:
1.40 - tz = None
1.41 +def get_datetime(value, attr=None):
1.42
1.43 - if attr.get("VALUE") in (None, "DATE-TIME"):
1.44 + """
1.45 + Return a datetime object from the given 'value' in iCalendar format, using
1.46 + the 'attr' mapping (if specified) to control the conversion.
1.47 + """
1.48 +
1.49 + if not attr or attr.get("VALUE") in (None, "DATE-TIME"):
1.50 m = match_datetime_icalendar(value)
1.51 if m:
1.52 dt = datetime(
1.53 @@ -122,13 +139,9 @@
1.54 # Impose the indicated timezone.
1.55 # NOTE: This needs an ambiguity policy for DST changes.
1.56
1.57 - tz = m.group("utc") and timezone("UTC") or tz or None
1.58 - if tz is not None:
1.59 - return tz.localize(dt)
1.60 - else:
1.61 - return dt
1.62 + return to_timezone(dt, m.group("utc") and "UTC" or attr and attr.get("TZID") or None)
1.63
1.64 - if attr.get("VALUE") == "DATE":
1.65 + if not attr or attr.get("VALUE") == "DATE":
1.66 m = match_date_icalendar(value)
1.67 if m:
1.68 return date(