Fix bug roundtripping datetime.time objects after midnight in eastern hemisphere timezones (#2417) (#2438)
* Fix bug roundtripping datetime.time objects after midnight in eastern hemisphere timezones (#2417)
* tests: check more timezones
* Fix review remarks: remove useless comment and skip setting TZ environment variable on Windows
diff --git a/tests/test_chrono.cpp b/tests/test_chrono.cpp
index 899d08d..1d79d4b 100644
--- a/tests/test_chrono.cpp
+++ b/tests/test_chrono.cpp
@@ -10,6 +10,7 @@
#include "pybind11_tests.h"
#include <pybind11/chrono.h>
+#include <chrono>
TEST_SUBMODULE(chrono, m) {
using system_time = std::chrono::system_clock::time_point;
diff --git a/tests/test_chrono.py b/tests/test_chrono.py
index 5392f8f..f94d5ba 100644
--- a/tests/test_chrono.py
+++ b/tests/test_chrono.py
@@ -1,6 +1,9 @@
# -*- coding: utf-8 -*-
from pybind11_tests import chrono as m
import datetime
+import pytest
+
+import env # noqa: F401
def test_chrono_system_clock():
@@ -70,8 +73,30 @@
assert time2.microsecond == 0
-def test_chrono_system_clock_roundtrip_time():
- time1 = datetime.datetime.today().time()
+SKIP_TZ_ENV_ON_WIN = pytest.mark.skipif(
+ "env.WIN", reason="TZ environment variable only supported on POSIX"
+)
+
+
+@pytest.mark.parametrize("time1", [
+ datetime.datetime.today().time(),
+ datetime.time(0, 0, 0),
+ datetime.time(0, 0, 0, 1),
+ datetime.time(0, 28, 45, 109827),
+ datetime.time(0, 59, 59, 999999),
+ datetime.time(1, 0, 0),
+ datetime.time(5, 59, 59, 0),
+ datetime.time(5, 59, 59, 1),
+])
+@pytest.mark.parametrize("tz", [
+ None,
+ pytest.param("Europe/Brussels", marks=SKIP_TZ_ENV_ON_WIN),
+ pytest.param("Asia/Pyongyang", marks=SKIP_TZ_ENV_ON_WIN),
+ pytest.param("America/New_York", marks=SKIP_TZ_ENV_ON_WIN),
+])
+def test_chrono_system_clock_roundtrip_time(time1, tz, monkeypatch):
+ if tz is not None:
+ monkeypatch.setenv("TZ", "/usr/share/zoneinfo/{}".format(tz))
# Roundtrip the time
datetime2 = m.test_chrono2(time1)