From 596f70130f40a0558e7f00aa385464d2f2e43c88 Mon Sep 17 00:00:00 2001 From: Ilja Date: Mon, 8 Apr 2024 14:12:08 +0200 Subject: [PATCH 1/2] fixes DateTime in nanoseconds not supported in PHP --- src/Utils/DateDeserializationSubscriber.php | 31 +++++++++++++++++++++ src/Utils/JSON.php | 7 ++++- 2 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 src/Utils/DateDeserializationSubscriber.php diff --git a/src/Utils/DateDeserializationSubscriber.php b/src/Utils/DateDeserializationSubscriber.php new file mode 100644 index 0000000..b7ce839 --- /dev/null +++ b/src/Utils/DateDeserializationSubscriber.php @@ -0,0 +1,31 @@ + 'serializer.pre_deserialize', + 'method' => 'onPreDeserialize', + 'format' => 'json', + ], + ]; + } + + public function onPreDeserialize(PreDeserializeEvent $event) + { + $data = $event->getData(); + $type = $event->getType(); + + if ($type['name'] === 'DateTime') { + $truncatedDatetime = preg_replace('/(\.\d{6})\d+Z$/', '$1Z', $data); + $event->setData($truncatedDatetime); + } + } +} diff --git a/src/Utils/JSON.php b/src/Utils/JSON.php index 7ef4ca7..f758253 100644 --- a/src/Utils/JSON.php +++ b/src/Utils/JSON.php @@ -8,6 +8,7 @@ namespace Ding\DingSDK\Utils; +use JMS\Serializer\EventDispatcher\EventDispatcher; use JMS\Serializer\Handler\HandlerRegistry; use JMS\Serializer\SerializerBuilder; @@ -20,6 +21,10 @@ static function (HandlerRegistry $registry): void { $registry->registerSubscribingHandler(new MixedJSONHandler()); $registry->registerSubscribingHandler(new EnumHandler()); }, - )->addDefaultHandlers()->build(); + )->addDefaultHandlers() + ->configureListeners(function(EventDispatcher $dispatcher) { + $dispatcher->addSubscriber(new DateDeserializationSubscriber()); + }) + ->build(); } } \ No newline at end of file From b2730fc632752b3468520e5fb083191018b4342e Mon Sep 17 00:00:00 2001 From: Ilja Date: Tue, 9 Apr 2024 14:32:27 +0200 Subject: [PATCH 2/2] fixing another issue with the datetime format --- src/Utils/DateDeserializationSubscriber.php | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/Utils/DateDeserializationSubscriber.php b/src/Utils/DateDeserializationSubscriber.php index b7ce839..b861ebb 100644 --- a/src/Utils/DateDeserializationSubscriber.php +++ b/src/Utils/DateDeserializationSubscriber.php @@ -27,5 +27,9 @@ public function onPreDeserialize(PreDeserializeEvent $event) $truncatedDatetime = preg_replace('/(\.\d{6})\d+Z$/', '$1Z', $data); $event->setData($truncatedDatetime); } + + if ($data === "0001-01-01T00:00:00Z") { + $event->setData("0001-01-01T00:00:00.000000Z"); + } } }