mirror of
https://github.com/pybind/pybind11.git
synced 2024-11-22 05:05:11 +00:00
Fix casting of time points with non-system-clock duration with VS (#1748)
* Fix casting of time points with non-system-clock duration on Windows Add explicit `time_point_cast` to time point with duration of system clock. Fixes Visual Studio compile error. * Add test case for custom time points casting
This commit is contained in:
parent
ed39c50458
commit
b3bf248eec
@ -128,7 +128,7 @@ public:
|
|||||||
// Lazy initialise the PyDateTime import
|
// Lazy initialise the PyDateTime import
|
||||||
if (!PyDateTimeAPI) { PyDateTime_IMPORT; }
|
if (!PyDateTimeAPI) { PyDateTime_IMPORT; }
|
||||||
|
|
||||||
std::time_t tt = system_clock::to_time_t(src);
|
std::time_t tt = system_clock::to_time_t(time_point_cast<system_clock::duration>(src));
|
||||||
// this function uses static memory so it's best to copy it out asap just in case
|
// this function uses static memory so it's best to copy it out asap just in case
|
||||||
// otherwise other code that is using localtime may break this (not just python code)
|
// otherwise other code that is using localtime may break this (not just python code)
|
||||||
std::tm localtime = *std::localtime(&tt);
|
std::tm localtime = *std::localtime(&tt);
|
||||||
|
@ -14,6 +14,10 @@
|
|||||||
TEST_SUBMODULE(chrono, m) {
|
TEST_SUBMODULE(chrono, m) {
|
||||||
using system_time = std::chrono::system_clock::time_point;
|
using system_time = std::chrono::system_clock::time_point;
|
||||||
using steady_time = std::chrono::steady_clock::time_point;
|
using steady_time = std::chrono::steady_clock::time_point;
|
||||||
|
|
||||||
|
using timespan = std::chrono::duration<int64_t, std::nano>;
|
||||||
|
using timestamp = std::chrono::time_point<std::chrono::system_clock, timespan>;
|
||||||
|
|
||||||
// test_chrono_system_clock
|
// test_chrono_system_clock
|
||||||
// Return the current time off the wall clock
|
// Return the current time off the wall clock
|
||||||
m.def("test_chrono1", []() { return std::chrono::system_clock::now(); });
|
m.def("test_chrono1", []() { return std::chrono::system_clock::now(); });
|
||||||
@ -44,4 +48,8 @@ TEST_SUBMODULE(chrono, m) {
|
|||||||
// Float durations (issue #719)
|
// Float durations (issue #719)
|
||||||
m.def("test_chrono_float_diff", [](std::chrono::duration<float> a, std::chrono::duration<float> b) {
|
m.def("test_chrono_float_diff", [](std::chrono::duration<float> a, std::chrono::duration<float> b) {
|
||||||
return a - b; });
|
return a - b; });
|
||||||
|
|
||||||
|
m.def("test_nano_timepoint", [](timestamp start, timespan delta) -> timestamp {
|
||||||
|
return start + delta;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
@ -99,3 +99,9 @@ def test_floating_point_duration():
|
|||||||
diff = m.test_chrono_float_diff(43.789012, 1.123456)
|
diff = m.test_chrono_float_diff(43.789012, 1.123456)
|
||||||
assert diff.seconds == 42
|
assert diff.seconds == 42
|
||||||
assert 665556 <= diff.microseconds <= 665557
|
assert 665556 <= diff.microseconds <= 665557
|
||||||
|
|
||||||
|
|
||||||
|
def test_nano_timepoint():
|
||||||
|
time = datetime.datetime.now()
|
||||||
|
time1 = m.test_nano_timepoint(time, datetime.timedelta(seconds=60))
|
||||||
|
assert(time1 == time + datetime.timedelta(seconds=60))
|
||||||
|
Loading…
Reference in New Issue
Block a user