from datetime import datetime, tzinfo, timedelta import time class timezone(tzinfo): def __init__(self, offset, name=None, dst=None): self.offset = offset self.name = name self.dst_ = dst def utcoffset(self, dt): return self.offset def dst(self, dt): return self.dst_ def tzname(self, dt): if self.name is None: offset = self.offset sign = '+' if offset < timedelta(0): offset = -offset sign = '-' return 'UTC%c%02d%02d' % (sign, offset.hours, offset.minutes) return self.name EPOCH = datetime(1970, 1, 1) STDOFFSET = timedelta(seconds=-time.timezone) DSTOFFSET = timedelta(seconds = -time.altzone) DSTDIFF = DSTOFFSET - STDOFFSET STDDIFF = timedelta(0) def localtime(utctime=None): if utctime is None: tm = time.localtime() else: seconds = (utctime - EPOCH).total_seconds() tm = time.localtime(seconds) tz = (timezone(DSTOFFSET, time.tzname[1], DSTDIFF) if tm.tm_isdst else timezone(STDOFFSET, time.tzname[0], STDDIFF)) return datetime(*tm[:6], tzinfo=tz) if __name__ == '__main__': for t in [localtime(), localtime(datetime.utcnow()), localtime(datetime.utcfromtimestamp(0))]: print(t.tzname(), t, t.timetuple().tm_isdst)