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.