diff --git a/src/taskgraph/optimize/base.py b/src/taskgraph/optimize/base.py index c6e84a5be..517c3e578 100644 --- a/src/taskgraph/optimize/base.py +++ b/src/taskgraph/optimize/base.py @@ -333,7 +333,7 @@ def replace_tasks( dependents = [target_task_graph.tasks[l] for l in dependents_of[label]] deadline = None if dependents: - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) deadline = max( resolve_timestamps(now, task.task["deadline"]) for task in dependents # type: ignore diff --git a/src/taskgraph/util/time.py b/src/taskgraph/util/time.py index 6639e5ddd..a613f9e83 100644 --- a/src/taskgraph/util/time.py +++ b/src/taskgraph/util/time.py @@ -88,7 +88,7 @@ def json_time_from_now(input_str, now=None, datetime_format=False): """ if now is None: - now = datetime.datetime.utcnow() + now = datetime.datetime.now(datetime.timezone.utc) time = now + value_of(input_str) @@ -98,7 +98,7 @@ def json_time_from_now(input_str, now=None, datetime_format=False): # Sorta a big hack but the json schema validator for date does not like the # ISO dates until 'Z' (for timezone) is added... # Microseconds are excluded (see bug 1381801) - return time.isoformat(timespec="milliseconds") + "Z" + return time.replace(tzinfo=None).isoformat(timespec="milliseconds") + "Z" def current_json_time(datetime_format=False): @@ -106,8 +106,9 @@ def current_json_time(datetime_format=False): :param boolean datetime_format: Set `True` to get a `datetime` output :returns: JSON string representation of the current time. """ + now = datetime.datetime.now(datetime.timezone.utc) if datetime_format is True: - return datetime.datetime.utcnow() + return now else: # Microseconds are excluded (see bug 1381801) - return datetime.datetime.utcnow().isoformat(timespec="milliseconds") + "Z" + return now.replace(tzinfo=None).isoformat(timespec="milliseconds") + "Z" diff --git a/test/test_optimize.py b/test/test_optimize.py index 17a7b0ccb..af9924f7e 100644 --- a/test/test_optimize.py +++ b/test/test_optimize.py @@ -2,7 +2,7 @@ # License, v. 2.0. If a copy of the MPL was not distributed with this # file, You can obtain one at http://mozilla.org/MPL/2.0/. -from datetime import datetime, timedelta +from datetime import datetime, timedelta, timezone from functools import partial import pytest @@ -28,8 +28,10 @@ def should_remove_task(self, task, params, arg): class Replace(OptimizationStrategy): def should_replace_task(self, task, params, deadline, taskid): - expires = datetime.utcnow() + timedelta(days=1) - if deadline and expires < datetime.strptime(deadline, "%Y-%m-%dT%H:%M:%S.%fZ"): + expires = datetime.now(timezone.utc) + timedelta(days=1) + if deadline and expires.replace(tzinfo=None) < datetime.strptime( + deadline, "%Y-%m-%dT%H:%M:%S.%fZ" + ): return False return taskid diff --git a/test/test_util_time.py b/test/test_util_time.py index 8fd0e23ab..af9447f10 100755 --- a/test/test_util_time.py +++ b/test/test_util_time.py @@ -4,7 +4,7 @@ import unittest -from datetime import datetime +from datetime import datetime, timezone from unittest.mock import patch from taskgraph.util.time import ( @@ -53,8 +53,13 @@ def test_json_from_now(self): def test_current_json_time(self): with patch("taskgraph.util.time.datetime.datetime") as mock_datetime: - mock_datetime.utcnow.return_value = datetime(2014, 1, 1) + mock_datetime.now.return_value = datetime(2014, 1, 1, tzinfo=timezone.utc) mock_datetime.side_effect = datetime assert current_json_time() == "2014-01-01T00:00:00.000Z" - assert current_json_time(True) == datetime(2014, 1, 1) + assert current_json_time(True) == datetime(2014, 1, 1, tzinfo=timezone.utc) + + def test_json_from_now_tzinfo(self): + now = datetime(2014, 1, 1, tzinfo=timezone.utc) + self.assertEqual(json_time_from_now("1 years", now), "2015-01-01T00:00:00.000Z") + self.assertEqual(json_time_from_now("6 days", now), "2014-01-07T00:00:00.000Z")