blob: 140e267f5f71f37793908767c156c585fbb7a19a [file] [log] [blame]
mgiuca@chromium.org81937562016-02-03 08:00:53 +00001# Copyright 2016 The Chromium Authors. All rights reserved.
2# Use of this source code is governed by a BSD-style license that can be
3# found in the LICENSE file.
mgiuca@chromium.org81937562016-02-03 08:00:53 +00004"""Utility module for dealing with Git timestamps."""
5
6import datetime
7
8
9def timestamp_offset_to_datetime(timestamp, offset):
Mike Frysinger124bb8e2023-09-06 05:48:55 +000010 """Converts a timestamp + offset into a datetime.datetime.
mgiuca@chromium.org81937562016-02-03 08:00:53 +000011
12 Useful for dealing with the output of porcelain commands, which provide times
13 as timestamp and offset strings.
14
15 Args:
16 timestamp: An int UTC timestamp, or a string containing decimal digits.
17 offset: A str timezone offset. e.g., '-0800'.
18
19 Returns:
20 A tz-aware datetime.datetime for this timestamp.
21 """
Mike Frysinger124bb8e2023-09-06 05:48:55 +000022 timestamp = int(timestamp)
23 tz = FixedOffsetTZ.from_offset_string(offset)
24 return datetime.datetime.fromtimestamp(timestamp, tz)
mgiuca@chromium.org81937562016-02-03 08:00:53 +000025
26
27def datetime_string(dt):
Mike Frysinger124bb8e2023-09-06 05:48:55 +000028 """Converts a tz-aware datetime.datetime into a string in git format."""
29 return dt.strftime('%Y-%m-%d %H:%M:%S %z')
mgiuca@chromium.org81937562016-02-03 08:00:53 +000030
31
32# Adapted from: https://docs.python.org/2/library/datetime.html#tzinfo-objects
33class FixedOffsetTZ(datetime.tzinfo):
Mike Frysinger124bb8e2023-09-06 05:48:55 +000034 def __init__(self, offset, name):
35 datetime.tzinfo.__init__(self)
36 self.__offset = offset
37 self.__name = name
mgiuca@chromium.org81937562016-02-03 08:00:53 +000038
Mike Frysinger124bb8e2023-09-06 05:48:55 +000039 def __repr__(self): # pragma: no cover
40 return '{}({!r}, {!r})'.format(
41 type(self).__name__, self.__offset, self.__name)
mgiuca@chromium.org81937562016-02-03 08:00:53 +000042
Mike Frysinger124bb8e2023-09-06 05:48:55 +000043 @classmethod
44 def from_offset_string(cls, offset):
45 try:
46 hours = int(offset[:-2])
47 minutes = int(offset[-2:])
48 except ValueError:
49 return cls(datetime.timedelta(0), 'UTC')
mgiuca@chromium.org81937562016-02-03 08:00:53 +000050
Mike Frysinger124bb8e2023-09-06 05:48:55 +000051 delta = datetime.timedelta(hours=hours, minutes=minutes)
52 return cls(delta, offset)
mgiuca@chromium.org81937562016-02-03 08:00:53 +000053
Mike Frysinger124bb8e2023-09-06 05:48:55 +000054 def utcoffset(self, dt):
55 return self.__offset
mgiuca@chromium.org81937562016-02-03 08:00:53 +000056
Mike Frysinger124bb8e2023-09-06 05:48:55 +000057 def tzname(self, dt):
58 return self.__name
mgiuca@chromium.org81937562016-02-03 08:00:53 +000059
Mike Frysinger124bb8e2023-09-06 05:48:55 +000060 def dst(self, dt):
61 return datetime.timedelta(0)