Source code for mygeotab.dates
# -*- coding: utf-8 -*-
"""
mygeotab.dates
~~~~~~~~~~~~~~
Date helper objects for timezone shifting and date formatting for the MyGeotab API.
"""
from datetime import datetime
import arrow
import pytz
MIN_DATE = pytz.utc.localize(datetime(1, 1, 1))
MAX_DATE = pytz.utc.localize(datetime(9999, 12, 31, 23, 59, 59, 999999))
[docs]
def format_iso_datetime(datetime_obj):
"""Formats the given datetime as a UTC-zoned ISO 8601 date string.
:param datetime_obj: The datetime or date object.
:type datetime_obj: datetime
:return: The datetime object in 8601 string form.
:rtype: datetime
"""
if not isinstance(datetime_obj, datetime):
return datetime_obj.isoformat()
datetime_obj = localize_datetime(datetime_obj, pytz.utc)
if datetime_obj < MIN_DATE:
datetime_obj = MIN_DATE
elif datetime_obj > MAX_DATE:
datetime_obj = MAX_DATE
return arrow.get(datetime_obj).format("YYYY-MM-DDTHH:mm:ss.SSS") + "Z"
[docs]
def localize_datetime(datetime_obj, tz=pytz.utc):
"""Converts a naive or UTC-localized date into the provided timezone.
:param datetime_obj: The datetime object.
:type datetime_obj: datetime
:param tz: The timezone. If blank or None, UTC is used.
:type tz: datetime.tzinfo
:return: The localized datetime object.
:rtype: datetime
"""
if not datetime_obj.tzinfo:
return tz.localize(datetime_obj)
else:
try:
return datetime_obj.astimezone(tz)
except OverflowError:
if datetime_obj < datetime(2, 1, 1, tzinfo=pytz.utc):
return MIN_DATE.astimezone(pytz.utc)
return MAX_DATE.astimezone(pytz.utc)