Skip to content

Commit 5019b5f

Browse files
committed
Added timezone-aware datetime implementation.
1 parent bf35a12 commit 5019b5f

1 file changed

Lines changed: 34 additions & 7 deletions

File tree

github2/core.py

Lines changed: 34 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,21 +13,31 @@
1313
COMMIT_DATE_FORMAT = "%Y-%m-%dT%H:%M:%S"
1414
GITHUB_TZ = tz.gettz("America/Los_Angeles")
1515

16+
# Operate on naive datetime objects, this is the default for backwards
17+
# compatibility
18+
NAIVE = True
19+
1620

1721
def ghdate_to_datetime(github_date):
1822
"""Convert Github date string to Python datetime
1923
2024
:param str github_date: date string to parse
2125
"""
22-
return parser.parse(github_date).replace(tzinfo=None)
26+
parsed = parser.parse(github_date)
27+
if NAIVE:
28+
parsed = parsed.replace(tzinfo=None)
29+
return parsed
2330

2431

2532
def datetime_to_ghdate(datetime_):
2633
"""Convert Python datetime to Github date string
2734
2835
:param datetime datetime_: datetime object to convert
2936
"""
30-
datetime_ = datetime_.replace(tzinfo=GITHUB_TZ)
37+
if not datetime_.tzinfo:
38+
datetime_ = datetime_.replace(tzinfo=GITHUB_TZ)
39+
else:
40+
datetime_ = datetime_.astimezone(GITHUB_TZ)
3141
return datetime_.strftime(GITHUB_DATE_FORMAT)
3242

3343

@@ -36,15 +46,21 @@ def commitdate_to_datetime(commit_date):
3646
3747
:param str github_date: date string to parse
3848
"""
39-
return parser.parse(commit_date).replace(tzinfo=None)
49+
parsed = parser.parse(commit_date)
50+
if NAIVE:
51+
parsed = parsed.replace(tzinfo=None)
52+
return parsed
4053

4154

4255
def datetime_to_commitdate(datetime_):
4356
"""Convert Python datetime to Github date string
4457
4558
:param datetime datetime_: datetime object to convert
4659
"""
47-
datetime_ = datetime_.replace(tzinfo=GITHUB_TZ)
60+
if not datetime_.tzinfo:
61+
datetime_ = datetime_.replace(tzinfo=GITHUB_TZ)
62+
else:
63+
datetime_ = datetime_.astimezone(GITHUB_TZ)
4864
date_without_tz = datetime_.strftime(COMMIT_DATE_FORMAT)
4965
utcoffset = GITHUB_TZ.utcoffset(datetime_)
5066
hours, minutes = divmod(utcoffset.days * 86400 + utcoffset.seconds, 3600)
@@ -62,23 +78,34 @@ def userdate_to_datetime(user_date):
6278
6379
:param str user_date: date string to parse
6480
"""
65-
return parser.parse(user_date).replace(tzinfo=None)
81+
parsed = parser.parse(user_date)
82+
if NAIVE:
83+
parsed = parsed.replace(tzinfo=None)
84+
return parsed
6685

6786

6887
def isodate_to_datetime(iso_date):
6988
"""Convert commit date string to Python datetime
7089
7190
:param str github_date: date string to parse
7291
"""
73-
return parser.parse(iso_date).replace(tzinfo=None)
92+
parsed = parser.parse(iso_date)
93+
if NAIVE:
94+
parsed = parsed.replace(tzinfo=None)
95+
return parsed
96+
7497

7598

7699
def datetime_to_isodate(datetime_):
77100
"""Convert Python datetime to Github date string
78101
79102
:param str datetime_: datetime object to convert
80103
"""
81-
return "%sZ" % datetime_.isoformat()
104+
if not datetime_.tzinfo:
105+
datetime_ = datetime_.replace(tzinfo=tz.tzutc())
106+
else:
107+
datetime_ = datetime_.astimezone(tz.tzutc())
108+
return "%sZ" % datetime_.isoformat()[:-6]
82109

83110

84111
class AuthError(Exception):

0 commit comments

Comments
 (0)