4
4
5
5
import builtins
6
6
import datetime
7
- import typing
7
+ import numbers
8
8
from typing import Union
9
9
10
- import isodate
11
- import pytz
12
10
from dateutil import parser
13
11
from isodate import parse_duration
14
12
17
15
"""
18
16
19
17
20
- def now_utc () -> datetime . datetime :
18
+ def now_utc ():
21
19
"""
22
20
Current local date and time in UTC timezone
23
21
@@ -27,7 +25,7 @@ def now_utc() -> datetime.datetime:
27
25
return datetime .datetime .now (datetime .timezone .utc )
28
26
29
27
30
- def today_utc () -> datetime . date :
28
+ def today_utc ():
31
29
"""
32
30
Current date in UTC timezone
33
31
@@ -37,7 +35,7 @@ def today_utc() -> datetime.date:
37
35
return datetime .datetime .now (datetime .timezone .utc ).date ()
38
36
39
37
40
- def timestamp (dt : Union [float , str ]) -> Union [ int , float ] :
38
+ def timestamp (dt : Union [numbers . Number , str ]):
41
39
"""
42
40
Converts a number or a string to a timestamp
43
41
@@ -50,21 +48,21 @@ def timestamp(dt: Union[float, str]) -> Union[int, float]:
50
48
:param dt: datetime to convert to timestamp
51
49
:return: unix timestamp
52
50
"""
53
- if isinstance (dt , ( int , float ) ):
51
+ if isinstance (dt , numbers . Number ):
54
52
return int (dt )
55
53
else :
56
- return _str_to_datetime (dt ).astimezone (pytz .utc ).timestamp ()
54
+ return _str_to_datetime (dt ).astimezone (datetime . timezone .utc ).timestamp ()
57
55
58
56
59
57
def _str_to_datetime (s : str ) -> datetime .datetime :
60
58
parsed_date = parser .isoparse (s )
61
59
if not parsed_date .tzinfo :
62
60
# Assume UTC if the input does not contain a timezone
63
- parsed_date = parsed_date .replace (tzinfo = pytz .utc )
64
- return parsed_date .astimezone (pytz .utc )
61
+ parsed_date = parsed_date .replace (tzinfo = datetime . timezone .utc )
62
+ return parsed_date .astimezone (datetime . timezone .utc )
65
63
66
64
67
- def max (* args : typing . Any ) -> typing . Any :
65
+ def max (* args ) :
68
66
"""
69
67
Returns biggest object of an iterable, or two or more arguments.
70
68
@@ -97,7 +95,7 @@ def day_delta(num_days: int, format: str = "%Y-%m-%dT%H:%M:%S.%f%z") -> str:
97
95
return (datetime .datetime .now (datetime .timezone .utc ) + datetime .timedelta (days = num_days )).strftime (format )
98
96
99
97
100
- def duration (datestring : str ) -> Union [ datetime .timedelta , isodate . Duration ] :
98
+ def duration (datestring : str ) -> datetime .timedelta :
101
99
"""
102
100
Converts ISO8601 duration to datetime.timedelta
103
101
@@ -113,17 +111,10 @@ def format_datetime(dt: Union[str, datetime.datetime], format: str) -> str:
113
111
114
112
Usage:
115
113
`"{{ format_datetime(config.start_date, '%Y-%m-%d') }}"`
116
-
117
- CPython Datetime package has known bug with `stfrtime` method: '%s' formatting uses locale timezone
118
- https://github.com/python/cpython/issues/77169
119
- https://github.com/python/cpython/issues/56959
120
114
"""
121
115
if isinstance (dt , datetime .datetime ):
122
116
return dt .strftime (format )
123
- dt_datetime = _str_to_datetime (dt )
124
- if format == "%s" :
125
- return str (int (dt_datetime .timestamp ()))
126
- return dt_datetime .strftime (format )
117
+ return _str_to_datetime (dt ).strftime (format )
127
118
128
119
129
120
_macros_list = [now_utc , today_utc , timestamp , max , day_delta , duration , format_datetime ]
0 commit comments