From be6859d877193004781c5b0b69f87b3ab5704ea1 Mon Sep 17 00:00:00 2001 From: Antoine Pitrou Date: Wed, 25 Nov 2009 23:02:32 +0000 Subject: Merged revisions 76529 via svnmerge from svn+ssh://pythondev@svn.python.org/python/trunk ........ r76529 | antoine.pitrou | 2009-11-25 23:59:36 +0100 (mer., 25 nov. 2009) | 4 lines Issue #5788: `datetime.timedelta` objects get a new `total_seconds()` method returning the total number of seconds in the duration. Patch by Brian Quinlan. ........ --- Doc/library/datetime.rst | 12 ++++++++++++ Lib/test/test_datetime.py | 7 +++++++ Misc/NEWS | 4 ++++ Modules/datetimemodule.c | 13 ++++++++++++- 4 files changed, 35 insertions(+), 1 deletion(-) diff --git a/Doc/library/datetime.rst b/Doc/library/datetime.rst index 68ae586..5126821 100644 --- a/Doc/library/datetime.rst +++ b/Doc/library/datetime.rst @@ -267,12 +267,24 @@ comparison is ``==`` or ``!=``. The latter cases return :const:`False` or efficient pickling, and in Boolean contexts, a :class:`timedelta` object is considered to be true if and only if it isn't equal to ``timedelta(0)``. +Instance methods: + +.. method:: timedelta.total_seconds() + + Return the total number of seconds contained in the duration. Equivalent to + ``td.microseconds / 1000000 + td.seconds + td.days * 24 * 3600``. + + .. versionadded:: 3.2 + + Example usage: >>> from datetime import timedelta >>> year = timedelta(days=365) >>> another_year = timedelta(weeks=40, days=84, hours=23, ... minutes=50, seconds=600) # adds up to 365 days + >>> year.total_seconds() + 31536000.0 >>> year == another_year True >>> ten_years = 10 * year diff --git a/Lib/test/test_datetime.py b/Lib/test/test_datetime.py index 8bf8420..d85217d 100644 --- a/Lib/test/test_datetime.py +++ b/Lib/test/test_datetime.py @@ -261,6 +261,13 @@ class TestTimeDelta(HarmlessMixedComparison, unittest.TestCase): self.assertEqual(td.seconds, seconds) self.assertEqual(td.microseconds, us) + def test_total_seconds(self): + td = timedelta(days=365) + self.assertEqual(td.total_seconds(), 31536000.0) + for total_seconds in [123456.789012, -123456.789012, 0.123456, 0, 1e6]: + td = timedelta(seconds=total_seconds) + self.assertEqual(td.total_seconds(), total_seconds) + def test_carries(self): t1 = timedelta(days=100, weeks=-7, diff --git a/Misc/NEWS b/Misc/NEWS index 70e0e1c..c7df776 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -140,6 +140,10 @@ C-API Library ------- +- Issue #5788: `datetime.timedelta` objects get a new `total_seconds()` + method returning the total number of seconds in the duration. Patch by + Brian Quinlan. + - Issue #7133: SSL objects now support the new buffer API. - Issue #1488943: difflib.Differ() doesn't always add hints for tab characters diff --git a/Modules/datetimemodule.c b/Modules/datetimemodule.c index 8ba3474..764de34 100644 --- a/Modules/datetimemodule.c +++ b/Modules/datetimemodule.c @@ -2063,6 +2063,14 @@ delta_getstate(PyDateTime_Delta *self) } static PyObject * +delta_total_seconds(PyObject *self) +{ + return PyFloat_FromDouble(GET_TD_MICROSECONDS(self) / 1000000.0 + + GET_TD_SECONDS(self) + + GET_TD_DAYS(self) * 24.0 * 3600.0); +} + +static PyObject * delta_reduce(PyDateTime_Delta* self) { return Py_BuildValue("ON", Py_TYPE(self), delta_getstate(self)); @@ -2084,7 +2092,10 @@ static PyMemberDef delta_members[] = { }; static PyMethodDef delta_methods[] = { - {"__reduce__", (PyCFunction)delta_reduce, METH_NOARGS, + {"total_seconds", (PyCFunction)delta_total_seconds, METH_NOARGS, + PyDoc_STR("Total seconds in the duration.")}, + + {"__reduce__", (PyCFunction)delta_reduce, METH_NOARGS, PyDoc_STR("__reduce__() -> (cls, state)")}, {NULL, NULL}, -- cgit v0.12