utils.py 1.7 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  1. from collections import namedtuple
  2. import datetime
  3. import sys
  4. import time
  5. Error = namedtuple('Error', ('metadata',))
  6. class UTC(datetime.tzinfo):
  7. """
  8. UTC implementation taken from Python's docs.
  9. Used only when pytz isn't available.
  10. """
  11. def __repr__(self):
  12. return "<UTC>"
  13. def utcoffset(self, dt):
  14. return datetime.timedelta(0)
  15. def tzname(self, dt):
  16. return "UTC"
  17. def dst(self, dt):
  18. return datetime.timedelta(0)
  19. def is_naive(dt):
  20. """
  21. Determines if a given datetime.datetime is naive.
  22. The concept is defined in Python's docs:
  23. http://docs.python.org/library/datetime.html#datetime.tzinfo
  24. Assuming value.tzinfo is either None or a proper datetime.tzinfo,
  25. value.utcoffset() implements the appropriate logic.
  26. """
  27. return dt.utcoffset() is None
  28. def is_aware(dt):
  29. return not is_naive(dt)
  30. def load_class(s):
  31. path, klass = s.rsplit('.', 1)
  32. __import__(path)
  33. mod = sys.modules[path]
  34. return getattr(mod, klass)
  35. def wrap_exception(new_exc_class):
  36. exc_class, exc, tb = sys.exc_info()
  37. raise new_exc_class('%s: %s' % (exc_class.__name__, exc))
  38. def make_naive(dt):
  39. """
  40. Makes an aware datetime.datetime naive in its time zone.
  41. """
  42. return dt.replace(tzinfo=None)
  43. def aware_to_utc(dt):
  44. """
  45. Converts an aware datetime.datetime in UTC time zone.
  46. """
  47. dt = dt.astimezone(UTC())
  48. assert not is_naive(dt), 'Must be a time zone aware datetime'
  49. return make_naive(dt)
  50. def local_to_utc(dt):
  51. """
  52. Converts a naive local datetime.datetime in UTC time zone.
  53. """
  54. return datetime.datetime(*time.gmtime(time.mktime(dt.timetuple()))[:6])