aboutsummaryrefslogtreecommitdiff
path: root/zencore/compactbinary.cpp
diff options
context:
space:
mode:
authorStefan Boberg <[email protected]>2021-10-19 16:34:28 +0200
committerStefan Boberg <[email protected]>2021-10-19 16:38:39 +0200
commit7bacd69310996263280f5695584801dcd243a73a (patch)
tree810ff390b697a8a7bab1d9a1492459fd17aa2fc8 /zencore/compactbinary.cpp
parentzenserver-test: Fixed up zcache tests (diff)
downloadzen-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.cpp91
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