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