# Copyright 2016 The Chromium Authors. All rights reserved. # Use of this source code is governed by a BSD-style license that can be # found in the LICENSE file. """Utility module for dealing with Git timestamps.""" import datetime def timestamp_offset_to_datetime(timestamp, offset): """Converts a timestamp + offset into a datetime.datetime. Useful for dealing with the output of porcelain commands, which provide times as timestamp and offset strings. Args: timestamp: An int UTC timestamp, or a string containing decimal digits. offset: A str timezone offset. e.g., '-0800'. Returns: A tz-aware datetime.datetime for this timestamp. """ timestamp = int(timestamp) tz = FixedOffsetTZ.from_offset_string(offset) return datetime.datetime.fromtimestamp(timestamp, tz) def datetime_string(dt): """Converts a tz-aware datetime.datetime into a string in git format.""" return dt.strftime('%Y-%m-%d %H:%M:%S %z') # Adapted from: https://docs.python.org/2/library/datetime.html#tzinfo-objects class FixedOffsetTZ(datetime.tzinfo): def __init__(self, offset, name): datetime.tzinfo.__init__(self) self.__offset = offset self.__name = name def __repr__(self): # pragma: no cover return '{}({!r}, {!r})'.format(type(self).__name__, self.__offset, self.__name) @classmethod def from_offset_string(cls, offset): try: hours = int(offset[:-2]) minutes = int(offset[-2:]) except ValueError: return cls(datetime.timedelta(0), 'UTC') delta = datetime.timedelta(hours=hours, minutes=minutes) return cls(delta, offset) def utcoffset(self, dt): return self.__offset def tzname(self, dt): return self.__name def dst(self, dt): return datetime.timedelta(0)