mirror of
https://github.com/HowardHinnant/date.git
synced 2025-08-05 21:54:27 +02:00
Added FILETIME conversions
@@ -25,6 +25,7 @@ This page contains examples and recipes contributed by community members. Feel f
|
|||||||
- [What is the epoch difference between Unix Time and GPS time?](#unix_gps_epoch_diff)
|
- [What is the epoch difference between Unix Time and GPS time?](#unix_gps_epoch_diff)
|
||||||
- [How to convert to/from C++ Builder's TDate and TDateTime](#TDate)
|
- [How to convert to/from C++ Builder's TDate and TDateTime](#TDate)
|
||||||
- [How to convert to/from QDate](#QDate)
|
- [How to convert to/from QDate](#QDate)
|
||||||
|
- [How to convert to/from Windows' FILETIME](#FILETIME)
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
@@ -1240,6 +1241,44 @@ Here are functions you can use to convert between [`QDate`](http://doc.qt.io/qt-
|
|||||||
|
|
||||||
These work by simply adjusting the epoch of these two types.
|
These work by simply adjusting the epoch of these two types.
|
||||||
|
|
||||||
|
<a name="FILETIME"></a>
|
||||||
|
### How to convert between Windows' `FILETIME` and `system_clock`
|
||||||
|
(by [Billy O'Neal](https://github.com/BillyONeal))
|
||||||
|
|
||||||
|
Here are functions and typedefs you can use to work with Windows' [FILETIME](https://msdn.microsoft.com/en-us/library/windows/desktop/ms724284.aspx) structure.
|
||||||
|
|
||||||
|
Assuming `system_clock` is based on the Unix epoch:
|
||||||
|
|
||||||
|
using std::ratio;
|
||||||
|
using std::chrono::duration;
|
||||||
|
using std::chrono::duration_cast;
|
||||||
|
using std::chrono::system_clock;
|
||||||
|
|
||||||
|
// filetime_duration has the same layout as FILETIME; 100ns intervals
|
||||||
|
using filetime_duration = duration<int64_t, ratio<1, 10'000'000>>;
|
||||||
|
// January 1, 1601 (NT epoch) - January 1, 1970 (Unix epoch):
|
||||||
|
constexpr duration<int64_t> nt_to_unix_epoch{INT64_C(-11644473600)};
|
||||||
|
|
||||||
|
system_clock::time_point FILETIME_to_system_clock(FILETIME fileTime) {
|
||||||
|
const filetime_duration asDuration{static_cast<int64_t>(
|
||||||
|
(static_cast<uint64_t>(fileTime.dwHighDateTime) << 32)
|
||||||
|
| fileTime.dwLowDateTime)};
|
||||||
|
const auto withUnixEpoch = asDuration + nt_to_unix_epoch;
|
||||||
|
return system_clock::time_point{
|
||||||
|
duration_cast<system_clock::duration>(withUnixEpoch)};
|
||||||
|
}
|
||||||
|
|
||||||
|
FILETIME system_clock_to_FILETIME(system_clock::time_point systemPoint) {
|
||||||
|
const auto asDuration = duration_cast<filetime_duration>(
|
||||||
|
systemPoint.time_since_epoch());
|
||||||
|
const auto withNtEpoch = asDuration - nt_to_unix_epoch;
|
||||||
|
const uint64_t rawCount = withNtEpoch.count();
|
||||||
|
FILETIME result;
|
||||||
|
result.dwLowDateTime = static_cast<DWORD>(rawCount); // discards upper bits
|
||||||
|
result.dwHighDateTime = static_cast<DWORD>(rawCount >> 32);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
***
|
***
|
||||||
|
|
||||||
 _This work is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/)._
|
 _This work is licensed under a [Creative Commons Attribution 4.0 International License](http://creativecommons.org/licenses/by/4.0/)._
|
Reference in New Issue
Block a user