diff -r ea7f22cf9c8c Lib/sqlite3/dbapi2.py --- a/Lib/sqlite3/dbapi2.py Wed Dec 28 10:23:24 2016 +0200 +++ b/Lib/sqlite3/dbapi2.py Thu Dec 29 20:20:37 2016 +0200 @@ -64,7 +64,15 @@ def register_adapters_and_converters(): return datetime.date(*map(int, val.split(b"-"))) def convert_timestamp(val): - datepart, timepart = val.split(b" ") + datepart, timetzpart = val.split(b" ") + if b"+" in timetzpart: + tzsign = 1 + timepart, tzpart = timetzpart.split(b"+") + elif b"-" in timetzpart: + tzsign = -1 + timepart, tzpart = timetzpart.split(b"-") + else: + timepart, tzpart = timetzpart, None year, month, day = map(int, datepart.split(b"-")) timepart_full = timepart.split(b".") hours, minutes, seconds = map(int, timepart_full[0].split(b":")) @@ -72,8 +80,15 @@ def register_adapters_and_converters(): microseconds = int('{:0<6.6}'.format(timepart_full[1].decode())) else: microseconds = 0 + if tzpart: + tzhours, tzminutes = map(int, tzpart.split(b":")) + tz = datetime.timezone( + tzsign * datetime.timedelta(hours=tzhours, minutes=tzminutes)) + else: + tz = None - val = datetime.datetime(year, month, day, hours, minutes, seconds, microseconds) + val = datetime.datetime(year, month, day, hours, minutes, seconds, + microseconds, tz) return val diff -r ea7f22cf9c8c Lib/sqlite3/test/types.py --- a/Lib/sqlite3/test/types.py Wed Dec 28 10:23:24 2016 +0200 +++ b/Lib/sqlite3/test/types.py Thu Dec 29 20:20:37 2016 +0200 @@ -404,6 +404,18 @@ class DateTimeTests(unittest.TestCase): ts2 = self.cur.fetchone()[0] self.assertEqual(ts, ts2) + def CheckDateTimeTimezone(self): + timezones = [datetime.timezone(datetime.timedelta(hours=6)), + datetime.timezone.utc, + datetime.timezone(-datetime.timedelta(hours=6))] + dts = [datetime.datetime(2004, 2, 14, 7, 15, 0, tzinfo=tz) + for tz in timezones] + self.cur.executemany("insert into test(ts) values (?)", + [(dt,) for dt in dts]) + self.cur.execute("select ts from test") + result = self.cur.fetchall() + self.assertEqual(set(dts), set(row[0] for row in result)) + def suite(): sqlite_type_suite = unittest.makeSuite(SqliteTypeTests, "Check") decltypes_type_suite = unittest.makeSuite(DeclTypesTests, "Check")