aboutsummaryrefslogtreecommitdiff
path: root/zencore/compactbinary.cpp
diff options
context:
space:
mode:
authorPer Larsson <[email protected]>2021-12-14 12:34:47 +0100
committerPer Larsson <[email protected]>2021-12-14 12:34:47 +0100
commitb6c6568e1618f10d2160d836b65e35586e3c740f (patch)
treef6a929cf918850bbba87d0ee67cd3482b2d50e24 /zencore/compactbinary.cpp
parentFixed bug in z$ service returning partial cache records and enable small obje... (diff)
parentPartial revert b363c5b (diff)
downloadzen-b6c6568e1618f10d2160d836b65e35586e3c740f.tar.xz
zen-b6c6568e1618f10d2160d836b65e35586e3c740f.zip
Merged main.
Diffstat (limited to 'zencore/compactbinary.cpp')
-rw-r--r--zencore/compactbinary.cpp186
1 files changed, 102 insertions, 84 deletions
diff --git a/zencore/compactbinary.cpp b/zencore/compactbinary.cpp
index c6bf38b04..494b45581 100644
--- a/zencore/compactbinary.cpp
+++ b/zencore/compactbinary.cpp
@@ -18,6 +18,8 @@
#if ZEN_PLATFORM_WINDOWS
# include <zencore/windows.h>
+#else
+# include <time.h>
#endif
#if ZEN_WITH_TESTS
@@ -46,15 +48,31 @@ IsLeapYear(int Year)
return false;
}
+static constexpr uint64_t
+GetPlatformToDateTimeBiasInSeconds()
+{
+#if ZEN_PLATFORM_WINDOWS
+ const uint64_t PlatformEpochYear = 1601;
+#else
+ const uint64_t PlatformEpochYear = 1970;
+#endif
+ const uint64_t DateTimeEpochYear = 1;
+ return uint64_t(double(PlatformEpochYear - DateTimeEpochYear) * 365.2425) * 86400;
+}
+
DateTime
DateTime::Now()
{
+ static const uint64_t EpochBias = GetPlatformToDateTimeBiasInSeconds();
+ static const uint64_t SecsTo100nsTicks = int64_t(10e9 / 100);
+
#if ZEN_PLATFORM_WINDOWS
FILETIME SysTime;
GetSystemTimeAsFileTime(&SysTime);
- return DateTime{504911232000000000ull + (uint64_t(SysTime.dwHighDateTime) << 32) | SysTime.dwLowDateTime};
+ return DateTime{(EpochBias * SecsTo100nsTicks) + (uint64_t(SysTime.dwHighDateTime) << 32) | SysTime.dwLowDateTime};
#else
-# error Needs implementation
+ int64_t SecondsSinceUnixEpoch = time(nullptr);
+ return DateTime{(EpochBias + SecondsSinceUnixEpoch) * SecsTo100nsTicks};
#endif
}
@@ -82,88 +100,6 @@ DateTime::Set(int Year, int Month, int Day, int Hour, int Minute, int Second, in
Second * TimeSpan::TicksPerSecond + MilliSecond * TimeSpan::TicksPerMillisecond;
}
-void
-TimeSpan::Set(int Days, int Hours, int Minutes, int Seconds, int FractionNano)
-{
- int64_t TotalTicks = 0;
-
- TotalTicks += Days * TicksPerDay;
- TotalTicks += Hours * TicksPerHour;
- TotalTicks += Minutes * TicksPerMinute;
- TotalTicks += Seconds * TicksPerSecond;
- TotalTicks += FractionNano / NanosecondsPerTick;
-
- Ticks = TotalTicks;
-}
-
-std::string
-TimeSpan::ToString(const char* Format) const
-{
- using namespace fmt::literals;
-
- StringBuilder<128> Result;
-
- Result.Append((Ticks < 0) ? '-' : '+');
-
- while (*Format != '\0')
- {
- if ((*Format == '%') && (*++Format != '\0'))
- {
- switch (*Format)
- {
- case 'd':
- Result.Append("{}"_format(GetDays()));
- break;
- case 'D':
- Result.Append("{:08}"_format(GetDays()));
- break;
- case 'h':
- Result.Append("{:02}"_format(GetHours()));
- break;
- case 'm':
- Result.Append("{:02}"_format(GetMinutes()));
- break;
- case 's':
- Result.Append("{:02}"_format(GetSeconds()));
- break;
- case 'f':
- Result.Append("{:03}"_format(GetFractionMilli()));
- break;
- case 'u':
- Result.Append("{:06}"_format(GetFractionMicro()));
- break;
- case 't':
- Result.Append("{:07}"_format(GetFractionTicks()));
- break;
- case 'n':
- Result.Append("{:09}"_format(GetFractionNano()));
- break;
- default:
- Result.Append(*Format);
- }
- }
- else
- {
- Result.Append(*Format);
- }
-
- ++Format;
- }
-
- return Result.ToString();
-}
-
-std::string
-TimeSpan::ToString() const
-{
- if (GetDays() == 0)
- {
- return ToString("%h:%m:%s.%f");
- }
-
- return ToString("%d.%h:%m:%s.%f");
-}
-
int
DateTime::GetYear() const
{
@@ -329,6 +265,88 @@ DateTime::ToIso8601() const
return ToString("%Y-%m-%dT%H:%M:%S.%sZ");
}
+void
+TimeSpan::Set(int Days, int Hours, int Minutes, int Seconds, int FractionNano)
+{
+ int64_t TotalTicks = 0;
+
+ TotalTicks += Days * TicksPerDay;
+ TotalTicks += Hours * TicksPerHour;
+ TotalTicks += Minutes * TicksPerMinute;
+ TotalTicks += Seconds * TicksPerSecond;
+ TotalTicks += FractionNano / NanosecondsPerTick;
+
+ Ticks = TotalTicks;
+}
+
+std::string
+TimeSpan::ToString(const char* Format) const
+{
+ using namespace fmt::literals;
+
+ StringBuilder<128> Result;
+
+ Result.Append((int64_t(Ticks) < 0) ? '-' : '+');
+
+ while (*Format != '\0')
+ {
+ if ((*Format == '%') && (*++Format != '\0'))
+ {
+ switch (*Format)
+ {
+ case 'd':
+ Result.Append("{}"_format(GetDays()));
+ break;
+ case 'D':
+ Result.Append("{:08}"_format(GetDays()));
+ break;
+ case 'h':
+ Result.Append("{:02}"_format(GetHours()));
+ break;
+ case 'm':
+ Result.Append("{:02}"_format(GetMinutes()));
+ break;
+ case 's':
+ Result.Append("{:02}"_format(GetSeconds()));
+ break;
+ case 'f':
+ Result.Append("{:03}"_format(GetFractionMilli()));
+ break;
+ case 'u':
+ Result.Append("{:06}"_format(GetFractionMicro()));
+ break;
+ case 't':
+ Result.Append("{:07}"_format(GetFractionTicks()));
+ break;
+ case 'n':
+ Result.Append("{:09}"_format(GetFractionNano()));
+ break;
+ default:
+ Result.Append(*Format);
+ }
+ }
+ else
+ {
+ Result.Append(*Format);
+ }
+
+ ++Format;
+ }
+
+ return Result.ToString();
+}
+
+std::string
+TimeSpan::ToString() const
+{
+ if (GetDays() == 0)
+ {
+ return ToString("%h:%m:%s.%f");
+ }
+
+ return ToString("%d.%h:%m:%s.%f");
+}
+
StringBuilderBase&
Guid::ToString(StringBuilderBase& Sb) const
{