Skip to content

Commit 2473480

Browse files
author
Michael Brewer
authored
fix(data-classes): include milliseconds in scalar types (#504)
1 parent cc128ad commit 2473480

File tree

2 files changed

+23
-14
lines changed

2 files changed

+23
-14
lines changed

Diff for: aws_lambda_powertools/utilities/data_classes/appsync/scalar_types_utils.py

+15-9
Original file line numberDiff line numberDiff line change
@@ -19,15 +19,21 @@ def _formatted_time(now: datetime.date, fmt: str, timezone_offset: int) -> str:
1919
str
2020
Returns string formatted time with optional timezone offset
2121
"""
22-
if timezone_offset == 0:
23-
return now.strftime(fmt + "Z")
22+
if timezone_offset != 0:
23+
now = now + datetime.timedelta(hours=timezone_offset)
24+
25+
datetime_str = now.strftime(fmt)
26+
if fmt.endswith(".%f"):
27+
datetime_str = datetime_str[:-3]
2428

25-
now = now + datetime.timedelta(hours=timezone_offset)
26-
fmt += "+" if timezone_offset > 0 else "-"
27-
fmt += str(abs(timezone_offset)).zfill(2)
28-
fmt += ":00:00"
29+
if timezone_offset == 0:
30+
postfix = "Z"
31+
else:
32+
postfix = "+" if timezone_offset > 0 else "-"
33+
postfix += str(abs(timezone_offset)).zfill(2)
34+
postfix += ":00:00"
2935

30-
return now.strftime(fmt)
36+
return datetime_str + postfix
3137

3238

3339
def make_id() -> str:
@@ -65,7 +71,7 @@ def aws_time(timezone_offset: int = 0) -> str:
6571
str
6672
Returns current time as AWSTime scalar string with optional timezone offset
6773
"""
68-
return _formatted_time(datetime.datetime.utcnow(), "%H:%M:%S", timezone_offset)
74+
return _formatted_time(datetime.datetime.utcnow(), "%H:%M:%S.%f", timezone_offset)
6975

7076

7177
def aws_datetime(timezone_offset: int = 0) -> str:
@@ -81,7 +87,7 @@ def aws_datetime(timezone_offset: int = 0) -> str:
8187
str
8288
Returns current time as AWSDateTime scalar string with optional timezone offset
8389
"""
84-
return _formatted_time(datetime.datetime.utcnow(), "%Y-%m-%dT%H:%M:%S", timezone_offset)
90+
return _formatted_time(datetime.datetime.utcnow(), "%Y-%m-%dT%H:%M:%S.%f", timezone_offset)
8591

8692

8793
def aws_timestamp() -> int:

Diff for: tests/functional/test_data_classes.py

+8-5
Original file line numberDiff line numberDiff line change
@@ -1210,13 +1210,18 @@ def test_aws_date_utc():
12101210
def test_aws_time_utc():
12111211
time_str = aws_time()
12121212
assert isinstance(time_str, str)
1213-
assert datetime.datetime.strptime(time_str, "%H:%M:%SZ")
1213+
assert datetime.datetime.strptime(time_str, "%H:%M:%S.%fZ")
12141214

12151215

12161216
def test_aws_datetime_utc():
12171217
datetime_str = aws_datetime()
1218-
assert isinstance(datetime_str, str)
1219-
assert datetime.datetime.strptime(datetime_str, "%Y-%m-%dT%H:%M:%SZ")
1218+
assert datetime.datetime.strptime(datetime_str[:-1] + "000Z", "%Y-%m-%dT%H:%M:%S.%fZ")
1219+
1220+
1221+
def test_format_time_to_milli():
1222+
now = datetime.datetime(2024, 4, 23, 16, 26, 34, 123021)
1223+
datetime_str = _formatted_time(now, "%H:%M:%S.%f", -12)
1224+
assert datetime_str == "04:26:34.123-12:00:00"
12201225

12211226

12221227
def test_aws_timestamp():
@@ -1227,14 +1232,12 @@ def test_aws_timestamp():
12271232
def test_format_time_positive():
12281233
now = datetime.datetime(2022, 1, 22)
12291234
datetime_str = _formatted_time(now, "%Y-%m-%d", 8)
1230-
assert isinstance(datetime_str, str)
12311235
assert datetime_str == "2022-01-22+08:00:00"
12321236

12331237

12341238
def test_format_time_negative():
12351239
now = datetime.datetime(2022, 1, 22, 14, 22, 33)
12361240
datetime_str = _formatted_time(now, "%H:%M:%S", -12)
1237-
assert isinstance(datetime_str, str)
12381241
assert datetime_str == "02:22:33-12:00:00"
12391242

12401243

0 commit comments

Comments
 (0)