Python has the concept of “naive” and “aware” times. The former refers to a timezone-capable date/time object that hasn’t been assigned a timezone, and the latter refers to one that has.
However, Python only provides an interface for “tzinfo” implementations: classes that define a particular timezone. It does not provide the implementations themselves. So, you either have to do your own implementations, or use something like the widely used “pytz” or “pytzpure” (a pure-Python version).
This is a quick example of how to write your own, courtesy of Google:
from datetime import tzinfo, timedelta, datetime
class _TzBase(tzinfo):
def utcoffset(self, dt):
return timedelta(hours=self.get_offset()) + self.dst(dt)
def _FirstSunday(self, dt):
"""First Sunday on or after dt."""
return dt + timedelta(days=(6 - dt.weekday()))
def dst(self, dt):
# 2 am on the second Sunday in March
dst_start = self._FirstSunday(datetime(dt.year, 3, 8, 2))
# 1 am on the first Sunday in November
dst_end = self._FirstSunday(datetime(dt.year, 11, 1, 1))
if dst_start <= dt.replace(tzinfo=None) < dst_end:
return timedelta(hours=1)
else:
return timedelta(hours=0)
def tzname(self, dt):
if self.dst(dt) == timedelta(hours=0):
return self.get_tz_name()
else:
return self.get_tz_with_dst_name()
def get_offset(self):
"""Returns the offset in hours (-5)."""
raise NotImplementedError()
def get_tz_name(self):
"""Returns the standard acronym (EST)."""
raise NotImplementedError()
def get_tz_with_dst_name(self):
"""Returns the DST version of the acronym ('EDT')."""
raise NotImplementedError()
class TzGmt(_TzBase):
"""Implementation of the EST timezone."""
def get_offset(self):
return 0
def get_tz_name(self):
return 'GMT'
def get_tz_with_dst_name(self):
return 'GMT'
class TzEst(_TzBase):
"""Implementation of the EST timezone."""
def get_offset(self):
return -5
def get_tz_name(self):
return 'EST'
def get_tz_with_dst_name(self):
return 'EDT'
Use it, like so:
from datetime import datetime now_est = datetime.now().replace(tzinfo=TzEst()) now_gmt = now_est.astimezone(TzGmt())
This produces a datetime object with an EST timezone, and then uses it to produce a GMT time.