Since Windows 10 1809 and Windows Server 2019, FILETIME includes leap seconds after 2018-06 (configurable system-wide, enabled by default), and will no longer be a constant offset from system_clock. system_clock::now needs to be updated to account for future leap seconds, if enabled on the system.
Command-line test case
Run the following command once as administrator. Note that this inserts a fake leap second (2020-11-30T23:59:60Z). The system clock and file modification times after 2020-11-30 will be off by 1 second.
The following command can be used to check the status of leap seconds.
C:\WINDOWS\system32>w32tm /leapseconds /getstatus /verbose
[闰秒]
Enabled: 1 (Local)
Number of Leap Seconds (after June 2018): 1 (Local)
Leap Seconds List (Local):
+2020-11-30T23:59:59
Run the test case.
D:\Temp>type leap_second_2.cpp
#include <Windows.h>
#include <chrono>
#include <cstdio>
using namespace std;
using namespace std::chrono;
int main() {
SYSTEMTIME win_sys_time;
GetSystemTime(&win_sys_time);
const auto stl_sys_time = system_clock::now();
const auto stl_total = stl_sys_time.time_since_epoch();
const auto stl_days = floor<duration<int, ratio<86400>>>(stl_total);
const auto stl_hours = floor<duration<int, ratio<3600>>>(stl_total - stl_days);
const auto stl_minutes = floor<duration<int, ratio<60>>>(stl_total - stl_days - stl_hours);
const auto stl_seconds = floor<duration<int>>(stl_total - stl_days - stl_hours - stl_minutes);
const auto stl_100ns =
floor<duration<int, ratio<1, 10'000'000>>>(stl_total - stl_days - stl_hours - stl_minutes - stl_seconds);
printf("Windows: %.4d-%.2d-%.2d %.2d:%.2d:%.2d.%.3d\n", win_sys_time.wYear, win_sys_time.wMonth, win_sys_time.wDay,
win_sys_time.wHour, win_sys_time.wMinute, win_sys_time.wSecond, win_sys_time.wMilliseconds);
printf(" STL: %10d %.2d:%.2d:%.2d.%.7d\n", stl_days.count(), stl_hours.count(), stl_minutes.count(),
stl_seconds.count(), stl_100ns.count());
}
D:\Temp>cl /EHsc /W4 /WX /std:c++latest leap_second_2.cpp
Microsoft (R) C/C++ Optimizing Compiler Version 19.28.29617 for x64
Copyright (C) Microsoft Corporation. All rights reserved.
/std:c++latest is provided as a preview of language features from the latest C++
working draft, and we're eager to hear about bugs and suggestions for improvements.
However, note that these features are provided as-is without support, and subject
to changes or removal as the working draft evolves. See
https://go.microsoft.com/fwlink/?linkid=2045807 for details.
leap_second_2.cpp
Microsoft (R) Incremental Linker Version 14.28.29617.0
Copyright (C) Microsoft Corporation. All rights reserved.
/out:leap_second_2.exe
leap_second_2.obj
D:\Temp>.\leap_second_2.exe
Windows: 2020-12-09 06:38:33.802
STL: 18605 06:38:34.8027188
After testing, run the following command as administrator and reboot to revert the fake leap second.
Describe the bug
Since Windows 10 1809 and Windows Server 2019,
FILETIME
includes leap seconds after 2018-06 (configurable system-wide, enabled by default), and will no longer be a constant offset fromsystem_clock
.system_clock::now
needs to be updated to account for future leap seconds, if enabled on the system.Command-line test case
Run the following command once as administrator. Note that this inserts a fake leap second (2020-11-30T23:59:60Z). The system clock and file modification times after 2020-11-30 will be off by 1 second.
The following command can be used to check the status of leap seconds.
Run the test case.
After testing, run the following command as administrator and reboot to revert the fake leap second.
Expected behavior
GetSystemTime
andsystem_clock::now
should return the same time.STL version
Additional context
Related to implementation of C++20
file_clock::to_sys
xorfile_clock::to_utc
.