From 534dfce1bb667d41c521e5e79a870dea90c9d9d3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Roger=20Vil=C3=A0?= Date: Wed, 4 Mar 2026 14:32:48 +0100 Subject: [PATCH] fix: diffIn methods --- python_carbon/__init__.py | 18 +++++----- tests/test_python_carbon.py | 66 +++++++++++++++++++++++++------------ 2 files changed, 54 insertions(+), 30 deletions(-) diff --git a/python_carbon/__init__.py b/python_carbon/__init__.py index c610f93..05739f2 100644 --- a/python_carbon/__init__.py +++ b/python_carbon/__init__.py @@ -441,19 +441,19 @@ def diffIn(self, unit: str, carbon: 'Carbon') -> int: return method(carbon) def diffInMicroseconds(self, carbon: 'Carbon') -> int: - return self.diffInSeconds(carbon) * 1000 + return int(round((self._date - carbon.toDatetime()).total_seconds() * 1_000_000)) - def diffInSeconds(self, carbon: 'Carbon') -> int: - return self.diffInMinutes(carbon) * 60 + def diffInSeconds(self, carbon: 'Carbon') -> float: + return (self._date - carbon.toDatetime()).total_seconds() - def diffInMinutes(self, carbon: 'Carbon') -> int: - return self.diffInHours(carbon) * 60 + def diffInMinutes(self, carbon: 'Carbon') -> float: + return self.diffInSeconds(carbon) / 60 - def diffInHours(self, carbon: 'Carbon') -> int: - return self.diffInDays(carbon) * 24 + def diffInHours(self, carbon: 'Carbon') -> float: + return self.diffInSeconds(carbon) / 3600 - def diffInDays(self, carbon: 'Carbon') -> int: - return (self._date - carbon.toDatetime()).days + def diffInDays(self, carbon: 'Carbon') -> float: + return self.diffInSeconds(carbon) / 86400 def diffInWeeks(self, carbon: 'Carbon') -> float: return self.diffInDays(carbon) / 7 diff --git a/tests/test_python_carbon.py b/tests/test_python_carbon.py index fadac7a..cd9ac1c 100644 --- a/tests/test_python_carbon.py +++ b/tests/test_python_carbon.py @@ -1,5 +1,5 @@ import unittest -from datetime import timedelta +from datetime import datetime, timedelta from python_carbon import Carbon @@ -85,32 +85,56 @@ def test_add_sub_and_last_day_of_month(self) -> None: self.assertIsInstance(Carbon.timedelta(days=1), timedelta) def test_difference_and_diffin_methods(self) -> None: - reference = Carbon.parse('1992-04-17 17:00:00') - now = Carbon.now() + earlier = Carbon.parse('2021-01-01 00:00:00.000000') + later = Carbon.parse('2022-03-04 05:06:07.123456') - diff = now.difference(reference) + diff = later.difference(earlier) self.assertIsInstance(diff, dict) self.assertEqual( set(diff.keys()), {'years', 'months', 'days', 'leapdays', 'hours', 'minutes', 'seconds', 'microseconds'} ) - - diff_years = now.diffIn('years', reference) - diff_months = now.diffIn('months', reference) - diff_weeks = now.diffIn('weeks', reference) - diff_days = now.diffIn('days', reference) - diff_hours = now.diffIn('hours', reference) - diff_minutes = now.diffIn('minutes', reference) - diff_seconds = now.diffIn('seconds', reference) - diff_microseconds = now.diffIn('microseconds', reference) - - self.assertGreater(diff_years, 0) - self.assertEqual(diff_months, now.difference(reference)['months'] + diff_years * 12) - self.assertEqual(diff_weeks, diff_days / 7) - self.assertEqual(diff_hours, diff_days * 24) - self.assertEqual(diff_minutes, diff_hours * 60) - self.assertEqual(diff_seconds, diff_minutes * 60) - self.assertEqual(diff_microseconds, diff_seconds * 1000) + self.assertEqual(diff['years'], 1) + self.assertEqual(diff['months'], 2) + self.assertEqual(diff['days'], 3) + self.assertEqual(diff['hours'], 5) + self.assertEqual(diff['minutes'], 6) + self.assertEqual(diff['seconds'], 7) + self.assertEqual(diff['microseconds'], 123456) + + expected_seconds = (datetime(2022, 3, 4, 5, 6, 7, 123456) - datetime(2021, 1, 1, 0, 0, 0, 0)).total_seconds() + expected_minutes = expected_seconds / 60 + expected_hours = expected_seconds / 3600 + expected_days = expected_seconds / 86400 + expected_weeks = expected_days / 7 + expected_microseconds = int(round(expected_seconds * 1_000_000)) + + diff_years = later.diffIn('years', earlier) + diff_months = later.diffIn('months', earlier) + diff_weeks = later.diffIn('weeks', earlier) + diff_days = later.diffIn('days', earlier) + diff_hours = later.diffIn('hours', earlier) + diff_minutes = later.diffIn('minutes', earlier) + diff_seconds = later.diffIn('seconds', earlier) + diff_microseconds = later.diffIn('microseconds', earlier) + + self.assertIsInstance(diff_years, int) + self.assertIsInstance(diff_months, int) + self.assertIsInstance(diff_weeks, float) + self.assertIsInstance(diff_days, float) + self.assertIsInstance(diff_hours, float) + self.assertIsInstance(diff_minutes, float) + self.assertIsInstance(diff_seconds, float) + self.assertIsInstance(diff_microseconds, int) + + self.assertEqual(diff_years, 1) + self.assertEqual(diff_months, 14) + self.assertAlmostEqual(diff_weeks, expected_weeks, places=12) + self.assertAlmostEqual(diff_days, expected_days, places=12) + self.assertAlmostEqual(diff_hours, expected_hours, places=12) + self.assertAlmostEqual(diff_minutes, expected_minutes, places=12) + self.assertAlmostEqual(diff_seconds, expected_seconds, places=12) + self.assertEqual(diff_microseconds, expected_microseconds) def test_cookie_iso_and_calendar_methods(self) -> None: cookie_string = Carbon.utcnow().toCookieString()