summaryrefslogtreecommitdiffstatshomepage
path: root/src/lib/util/timeconv.cpp
diff options
context:
space:
mode:
author Vas Crabb <vas@vastheman.com>2016-06-26 22:27:47 +1000
committer Vas Crabb <vas@vastheman.com>2016-06-26 22:44:21 +1000
commit923151d00bb92f5c11d24fecf643f4af8f0c2114 (patch)
tree64e7b7f7576ffc4d037f37cc5a559b6fdef1d5bb /src/lib/util/timeconv.cpp
parent78df22b1067a7ff9fdd91bcb54f0d16939a849d4 (diff)
parent5009b55430ba99295c0d7a31b336c61795f6cec3 (diff)
Fixed incorrect implementation of win_time_point_from_filetime()
Diffstat (limited to 'src/lib/util/timeconv.cpp')
-rw-r--r--src/lib/util/timeconv.cpp82
1 files changed, 82 insertions, 0 deletions
diff --git a/src/lib/util/timeconv.cpp b/src/lib/util/timeconv.cpp
new file mode 100644
index 00000000000..4511aa20d41
--- /dev/null
+++ b/src/lib/util/timeconv.cpp
@@ -0,0 +1,82 @@
+// license:BSD-3-Clause
+// copyright-holders:Vas Crabb, Nathan Woods
+/*********************************************************************
+
+ timeconv.cpp
+
+ Time conversion utility code
+
+***************************************************************************/
+
+#include "timeconv.h"
+
+#include <ctime>
+
+
+namespace util {
+namespace {
+/***************************************************************************
+ PROTOTYPES
+***************************************************************************/
+
+util::ntfs_duration calculate_ntfs_offset();
+
+
+/***************************************************************************
+ GLOBAL VARIABLES
+***************************************************************************/
+
+util::ntfs_duration f_ntfs_offset(calculate_ntfs_offset());
+
+
+/***************************************************************************
+ IMPLEMENTATION
+***************************************************************************/
+
+util::ntfs_duration calculate_ntfs_offset()
+{
+ constexpr auto days_in_year(365);
+ constexpr auto days_in_four_years((days_in_year * 4) + 1);
+ constexpr auto days_in_century((days_in_four_years * 25) - 1);
+ constexpr auto days_in_four_centuries((days_in_century * 4) + 1);
+
+ constexpr ntfs_duration day(std::chrono::hours(24));
+ constexpr ntfs_duration year(day * days_in_year);
+ constexpr ntfs_duration four_years(day * days_in_four_years);
+ constexpr ntfs_duration century(day * days_in_century);
+ constexpr ntfs_duration four_centuries(day * days_in_four_centuries);
+
+ std::time_t const zero(0);
+ std::tm const epoch(*std::gmtime(&zero));
+
+ ntfs_duration result(day * epoch.tm_yday);
+ result += std::chrono::hours(epoch.tm_hour);
+ result += std::chrono::minutes(epoch.tm_min);
+ result += std::chrono::seconds(epoch.tm_sec);
+
+ int years(1900 - 1601 + epoch.tm_year);
+ result += four_centuries * (years / 400);
+ years %= 400;
+ result += century * (years / 100);
+ years %= 100;
+ result += four_years * (years / 4);
+ years %= 4;
+ result += year * years;
+
+ return result;
+}
+
+} // anonymous namespace
+
+
+
+// -------------------------------------------------
+// system_clock_time_point_from_ntfs_duration
+// -------------------------------------------------
+
+std::chrono::system_clock::time_point system_clock_time_point_from_ntfs_duration(ntfs_duration d)
+{
+ return std::chrono::system_clock::from_time_t(0) + std::chrono::duration_cast<std::chrono::system_clock::duration>(d - f_ntfs_offset);
+}
+
+} // namespace util