diff options
| author | Stefan Boberg <[email protected]> | 2021-10-19 16:34:28 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-10-19 16:38:39 +0200 |
| commit | 7bacd69310996263280f5695584801dcd243a73a (patch) | |
| tree | 810ff390b697a8a7bab1d9a1492459fd17aa2fc8 /zencore/compactbinary.cpp | |
| parent | zenserver-test: Fixed up zcache tests (diff) | |
| download | zen-7bacd69310996263280f5695584801dcd243a73a.tar.xz zen-7bacd69310996263280f5695584801dcd243a73a.zip | |
cb: Implemented DateTime::Now() and fixed DateTime/TimeSpan string formatting
Diffstat (limited to 'zencore/compactbinary.cpp')
| -rw-r--r-- | zencore/compactbinary.cpp | 91 |
1 files changed, 67 insertions, 24 deletions
diff --git a/zencore/compactbinary.cpp b/zencore/compactbinary.cpp index c4694733c..aafb365f3 100644 --- a/zencore/compactbinary.cpp +++ b/zencore/compactbinary.cpp @@ -16,6 +16,10 @@ #include <fmt/format.h> #include <string_view> +#if ZEN_PLATFORM_WINDOWS +# include <zencore/windows.h> +#endif + #if ZEN_WITH_TESTS # include <json11.hpp> # include <zencore/compactbinarybuilder.h> @@ -42,6 +46,18 @@ IsLeapYear(int Year) return false; } +DateTime +DateTime::Now() +{ +#if ZEN_PLATFORM_WINDOWS + FILETIME SysTime; + GetSystemTimeAsFileTime(&SysTime); + return DateTime{504911232000000000ull + (uint64_t(SysTime.dwHighDateTime) << 32) | SysTime.dwLowDateTime}; +#else +# error Needs implementation +#endif +} + void DateTime::Set(int Year, int Month, int Day, int Hour, int Minute, int Second, int MilliSecond) { @@ -96,31 +112,31 @@ TimeSpan::ToString(const char* Format) const switch (*Format) { case 'd': - Result.Append("%i"_format(GetDays())); + Result.Append("{}"_format(GetDays())); break; case 'D': - Result.Append("%08i"_format(GetDays())); + Result.Append("{:08}"_format(GetDays())); break; case 'h': - Result.Append("%02i"_format(GetHours())); + Result.Append("{:02}"_format(GetHours())); break; case 'm': - Result.Append("%02i"_format(GetMinutes())); + Result.Append("{:02}"_format(GetMinutes())); break; case 's': - Result.Append("%02i"_format(GetSeconds())); + Result.Append("{:02}"_format(GetSeconds())); break; case 'f': - Result.Append("%03i"_format(GetFractionMilli())); + Result.Append("{:03}"_format(GetFractionMilli())); break; case 'u': - Result.Append("%06i"_format(GetFractionMicro())); + Result.Append("{:06}"_format(GetFractionMicro())); break; case 't': - Result.Append("%07i"_format(GetFractionTicks())); + Result.Append("{:07}"_format(GetFractionTicks())); break; case 'n': - Result.Append("%09i"_format(GetFractionNano())); + Result.Append("{:09}"_format(GetFractionNano())); break; default: Result.Append(*Format); @@ -247,8 +263,8 @@ DateTime::ToString(const char* Format) const { using namespace fmt::literals; - StringBuilder<32> Result; - int Year, Month, Day; + ExtendableStringBuilder<32> Result; + int Year, Month, Day; GetDate(Year, Month, Day); @@ -263,32 +279,32 @@ DateTime::ToString(const char* Format) const // case 'a': Result.Append(IsMorning() ? TEXT("am") : TEXT("pm")); break; // case 'A': Result.Append(IsMorning() ? TEXT("AM") : TEXT("PM")); break; case 'd': - Result.Append("%02i"_format(Day)); + Result.Append("{:02}"_format(Day)); break; // case 'D': Result.Appendf(TEXT("%03i"), GetDayOfYear()); break; case 'm': - Result.Append("%02i"_format(Month)); + Result.Append("{:02}"_format(Month)); break; case 'y': - Result.Append("%02i"_format(Year % 100)); + Result.Append("{:02}"_format(Year % 100)); break; case 'Y': - Result.Append("%04i"_format(Year % 100)); + Result.Append("{:04}"_format(Year)); break; case 'h': - Result.Append("%02i"_format(GetHour12())); + Result.Append("{:02}"_format(GetHour12())); break; case 'H': - Result.Append("%02i"_format(GetHour())); + Result.Append("{:02}"_format(GetHour())); break; case 'M': - Result.Append("%02i"_format(GetMinute())); + Result.Append("{:02}"_format(GetMinute())); break; case 'S': - Result.Append("%02i"_format(GetSecond())); + Result.Append("{:02}"_format(GetSecond())); break; case 's': - Result.Append("%03i"_format(GetMillisecond())); + Result.Append("{:03}"_format(GetMillisecond())); break; default: Result.Append(*Format); @@ -1659,10 +1675,10 @@ private: } private: - StringBuilderBase& Builder; - StringBuilder<32> NewLineAndIndent; - bool NeedsComma{false}; - bool NeedsNewLine{false}; + StringBuilderBase& Builder; + ExtendableStringBuilder<32> NewLineAndIndent; + bool NeedsComma{false}; + bool NeedsNewLine{false}; }; void @@ -1902,6 +1918,33 @@ TEST_CASE("uson.json") CHECK(DoubleValue == 0); } } + +TEST_CASE("uson.datetime") +{ + using namespace std::literals; + + { + DateTime D1600(1601, 1, 1); + CHECK_EQ(D1600.GetYear(), 1601); + CHECK_EQ(D1600.GetMonth(), 1); + CHECK_EQ(D1600.GetDay(), 1); + CHECK_EQ(D1600.GetHour(), 0); + CHECK_EQ(D1600.GetMinute(), 0); + CHECK_EQ(D1600.GetSecond(), 0); + + CHECK_EQ(D1600.ToIso8601(), "1601-01-01T00:00:00.000Z"sv); + } + + { + DateTime D72(1972, 2, 23, 17, 30, 10); + CHECK_EQ(D72.GetYear(), 1972); + CHECK_EQ(D72.GetMonth(), 2); + CHECK_EQ(D72.GetDay(), 23); + CHECK_EQ(D72.GetHour(), 17); + CHECK_EQ(D72.GetMinute(), 30); + CHECK_EQ(D72.GetSecond(), 10); + } +} #endif } // namespace zen |