|  | # 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) |