From 31b92ea89aa096026e3550a45749d054b320b869 Mon Sep 17 00:00:00 2001 From: SAY-5 Date: Sat, 23 May 2026 22:17:53 -0700 Subject: [PATCH] fix: skip time truncation for date objects in truncate_datetime --- deepdiff/helper.py | 4 +++- tests/test_diff_other.py | 9 +++++++++ 2 files changed, 12 insertions(+), 1 deletion(-) diff --git a/deepdiff/helper.py b/deepdiff/helper.py index 3fc61183..036d2f64 100644 --- a/deepdiff/helper.py +++ b/deepdiff/helper.py @@ -690,7 +690,9 @@ def datetime_normalize( datetime.timezone, "BaseTzInfo" ] = datetime.timezone.utc, ) -> Any: - if truncate_datetime: + # A plain date has no time component, so truncation does not apply to it. + has_time = not (isinstance(obj, datetime.date) and not isinstance(obj, datetime.datetime)) + if truncate_datetime and has_time: if truncate_datetime == 'second': obj = obj.replace(microsecond=0) elif truncate_datetime == 'minute': diff --git a/tests/test_diff_other.py b/tests/test_diff_other.py index 316b98b9..40f60c82 100644 --- a/tests/test_diff_other.py +++ b/tests/test_diff_other.py @@ -71,6 +71,15 @@ def test_truncate_datetime(self): res = DeepDiff(d1, d2, truncate_datetime='second') assert res['values_changed']["root['a']"]['new_value'] == 80139 + def test_truncate_datetime_with_date(self): + d1 = {'a': datetime.date(2020, 5, 17)} + d2 = {'a': datetime.date(2020, 5, 17)} + assert DeepDiff(d1, d2, truncate_datetime='minute') == {} + + d3 = {'a': datetime.date(2020, 5, 18)} + res = DeepDiff(d1, d3, truncate_datetime='day') + assert res['values_changed']["root['a']"]['new_value'] == datetime.date(2020, 5, 18) + def test_invalid_verbose_level(self): with pytest.raises(ValueError) as excinfo: DeepDiff(1, 2, verbose_level=5)