Skip to content

Commit d924ccf

Browse files
Allow passing relative timedeltas to from_datetime (#645)
1 parent 57311f1 commit d924ccf

File tree

3 files changed

+27
-0
lines changed

3 files changed

+27
-0
lines changed

CHANGELOG.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,7 @@ and this project adheres to [Semantic Versioning](https://semver.org/spec/v2.0.0
66

77
## [Unreleased]
88
### Added
9+
- Support for passing relative timedeltas to [tanjun.conversion.from_datetime][].
910
- Support for passing multiple callbacks to `add_check`, `add_client_callback`, `add_listener`,
1011
`add_on_close` and `add_on_open`.
1112

tanjun/conversion.py

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1364,7 +1364,17 @@ def to_datetime(value: str, /) -> datetime.datetime:
13641364
_VALID_DATETIME_STYLES = frozenset(("t", "T", "d", "D", "f", "F", "R"))
13651365

13661366

1367+
@typing.overload
1368+
def from_datetime(value: datetime.timedelta, /) -> str:
1369+
...
1370+
1371+
1372+
@typing.overload
13671373
def from_datetime(value: datetime.datetime, /, *, style: str = "f") -> str:
1374+
...
1375+
1376+
1377+
def from_datetime(value: typing.Union[datetime.datetime, datetime.timedelta], /, *, style: str = "f") -> str:
13681378
"""Format a datetime as Discord's datetime format.
13691379
13701380
More information on this format can be found at
@@ -1374,12 +1384,17 @@ def from_datetime(value: datetime.datetime, /, *, style: str = "f") -> str:
13741384
----------
13751385
value
13761386
The datetime to format.
1387+
1388+
If a timedelta is passed here then this is treated as a date that's
1389+
relative to the current time.
13771390
style
13781391
The style to use.
13791392
13801393
The valid styles can be found at
13811394
<https://discord.com/developers/docs/reference#message-formatting-formats>.
13821395
1396+
This is always "R" when `value` is a [datetime.timedelta][].
1397+
13831398
Returns
13841399
-------
13851400
str
@@ -1391,6 +1406,9 @@ def from_datetime(value: datetime.datetime, /, *, style: str = "f") -> str:
13911406
If the provided datetime is timezone naive.
13921407
If an invalid style is provided.
13931408
"""
1409+
if isinstance(value, datetime.timedelta):
1410+
return from_datetime(datetime.datetime.now(tz=datetime.timezone.utc) + value, style="R")
1411+
13941412
if style not in _VALID_DATETIME_STYLES:
13951413
raise ValueError(f"Invalid style: {style}")
13961414

tests/test_conversion.py

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -38,6 +38,7 @@
3838
import urllib.parse
3939
from unittest import mock
4040

41+
import freezegun
4142
import hikari
4243
import pytest
4344

@@ -1855,6 +1856,13 @@ def test_from_datetime_for_invalid_style():
18551856
tanjun.conversion.from_datetime(date, style="granddad")
18561857

18571858

1859+
def test_from_datetime_for_time_delta():
1860+
with freezegun.freeze_time(datetime.datetime(2022, 12, 30, 6, 33, 47, 52643, tzinfo=datetime.timezone.utc)):
1861+
result = tanjun.conversion.from_datetime(datetime.timedelta(days=21, hours=23, minutes=32, seconds=34))
1862+
1863+
assert result == "<t:1674281181:R>"
1864+
1865+
18581866
@pytest.mark.parametrize(
18591867
("value", "expected"),
18601868
[

0 commit comments

Comments
 (0)