From 29e30161fa25fb70a9e6558772ac1d686b826fea Mon Sep 17 00:00:00 2001 From: Tao Zhang Date: Thu, 29 Feb 2024 02:21:40 -0800 Subject: [PATCH] fix pythonCollectionFromPropertyList fails on converting dates prior to 1970 --- pyobjc-framework-Cocoa/Lib/PyObjCTools/Conversion.py | 6 +++++- pyobjc-framework-Cocoa/PyObjCTest/test_conversion.py | 7 +++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/pyobjc-framework-Cocoa/Lib/PyObjCTools/Conversion.py b/pyobjc-framework-Cocoa/Lib/PyObjCTools/Conversion.py index 220ee32158..6e8ba85cfc 100644 --- a/pyobjc-framework-Cocoa/Lib/PyObjCTools/Conversion.py +++ b/pyobjc-framework-Cocoa/Lib/PyObjCTools/Conversion.py @@ -217,7 +217,11 @@ def pythonCollectionFromPropertyList(aCollection, conversionHelper=None): elif isinstance(aCollection, Foundation.NSData): return bytes(aCollection) elif isinstance(aCollection, Foundation.NSDate): - return datetime.datetime.fromtimestamp(aCollection.timeIntervalSince1970()) + timestamp = aCollection.timeIntervalSince1970() + if timestamp < 0: + return datetime.datetime.fromtimestamp(0) - datetime.timedelta(seconds=-timestamp) + else: + return datetime.datetime.fromtimestamp(timestamp) elif isinstance(aCollection, (objc.pyobjc_unicode, Foundation.NSString)): return str(aCollection) elif isinstance(aCollection, OC_PythonLong): diff --git a/pyobjc-framework-Cocoa/PyObjCTest/test_conversion.py b/pyobjc-framework-Cocoa/PyObjCTest/test_conversion.py index ea32f87e80..014aa15511 100644 --- a/pyobjc-framework-Cocoa/PyObjCTest/test_conversion.py +++ b/pyobjc-framework-Cocoa/PyObjCTest/test_conversion.py @@ -186,6 +186,13 @@ def test_pythonCollectionFromPropertyList(self): v = Conversion.pythonCollectionFromPropertyList(value) self.assertIsInstance(v, datetime.datetime) + with self.subTest("date prior year 1970"): + value = Cocoa.NSDate.dateWithTimeIntervalSince1970_(-10000000000) + self.assertIsInstance(value, Cocoa.NSDate) + + v = Conversion.pythonCollectionFromPropertyList(value) + self.assertIsInstance(v, datetime.datetime) + with self.subTest("decimal"): value = Cocoa.NSDecimalNumber.decimalNumberWithString_("42.5") self.assertIsInstance(value, Cocoa.NSDecimalNumber)