Difference
==========
The ``diff()`` method returns a `Period`_ instance that represents the total duration
between two ``Pendulum`` instances. This interval can be then expressed in various units.
These interval methods always return *the total difference expressed* in the specified time requested.
All values are truncated and not rounded.
The ``diff()`` method has a default first parameter which is the ``Pendulum`` instance to compare to,
or ``None`` if you want to use ``now()``.
The 2nd parameter is optional and indicates if you want the return value to be the absolute value
or a relative value that might have a ``-`` (negative) sign if the passed in date
is less than the current instance.
This will default to ``True``, return the absolute value. The comparisons are done in UTC.
.. code-block:: python
import pendulum
dt_ottawa = pendulum.create(2000, 1, 1, tz='America/Toronto')
dt_vancouver = pendulum.create(2000, 1, 1, tz='America/Vancouver')
dt_ottawa.diff(dt_vancouver).in_hours()
3
dt_ottawa.diff(dt_vancouver, False).in_hours()
3
dt_vancouver.diff(dt_ottawa, False).in_hours()
-3
dt = pendulum.create(2012, 1, 31, 0)
dt.diff(dt.add(months=1)).in_days()
29
dt.diff(dt.subtract(months=1), False).in_days()
-31
dt = pendulum.create(2012, 4, 30, 0)
dt.diff(dt.add(months=1)).in_days()
30
dt.diff(dt.add(weeks=1)).in_days()
7
dt = pendulum.create(2012, 1, 1, 0)
dt.diff(dt.add(seconds=59)).in_minutes()
0
dt.diff(dt.add(seconds=60)).in_minutes()
1
dt.diff(dt.add(seconds=119)).in_minutes()
1
dt.diff(dt.add(seconds=120)).in_minutes()
2
dt.add(seconds=120).seconds_since_midnight()
120
Difference for Humans
---------------------
The ``diff_for_humans()`` method will add a phrase after the difference value relative
to the instance and the passed in instance. There are 4 possibilities:
* When comparing a value in the past to default now:
* 1 hour ago
* 5 months ago
* When comparing a value in the future to default now:
* 1 hour from now
* 5 months from now
* When comparing a value in the past to another value:
* 1 hour before
* 5 months before
* When comparing a value in the future to another value:
* 1 hour after
* 5 months after
You may also pass ``True`` as a 2nd parameter to remove the modifiers `ago`, `from now`, etc.
.. code-block:: python
import pendulum
# The most typical usage is for comments
# The instance is the date the comment was created
# and its being compared to default now()
pendulum.now().subtract(days=1).diff_for_humans()
'5 days ago'
pendulum.now().diff_for_humans(Pendulum.now().subtract(years=1))
'1 year after'
dt = pendulum.create(2011, 8, 1)
dt.diff_for_humans(dt.add(months=1))
'1 month before'
dt.diff_for_humans(dt.subtract(months=1))
'1 month after'
pendulum.now().add(seconds=5).diff_for_humans()
'5 seconds from now'
pendulum.now().subtract(days=24).diff_for_humans()
'3 weeks ago'
pendulum.now().subtract(days=24).diff_for_humans(absolute=True)
'3 weeks'
You can also change the locale of the string either globally by using ``pendulum.set_locale('fr')``
before the ``diff_for_humans()`` call or specifically for the call by passing the ``locale`` keyword
argument. See the `Localization`_ section for more detail.
.. code-block:: python
import pendulum
pendulum.set_locale('de')
pendulum.now().add(years=1).diff_for_humans()
'in 1 Jahr'
pendulum.now().add(years=1).diff_for_humans(locale='fr')
'dans 1 an'