blob: 41cf3acf983d58408f26b2f8e9bd61cba01f4a82 [file] [log] [blame]
# 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)