From a5b130305e78867742c7113af64daed03a83909b Mon Sep 17 00:00:00 2001 From: emeric Date: Fri, 11 Apr 2025 18:02:58 +0200 Subject: [PATCH] Append Z to iso8601 date time strings --- src/libs/core/impl/PartialDateTime.cpp | 2 +- src/libs/core/impl/String.cpp | 5 ++- .../core/include/core/PartialDateTime.hpp | 2 +- src/libs/core/test/PartialDateTime.cpp | 32 +++++++++---------- src/libs/core/test/String.cpp | 5 +-- .../impl/traits/PartialDateTimeTraits.hpp | 2 +- src/tools/metadata/LmsMetadata.cpp | 6 ++-- 7 files changed, 29 insertions(+), 25 deletions(-) diff --git a/src/libs/core/impl/PartialDateTime.cpp b/src/libs/core/impl/PartialDateTime.cpp index bfa849ad..acdbf5f2 100644 --- a/src/libs/core/impl/PartialDateTime.cpp +++ b/src/libs/core/impl/PartialDateTime.cpp @@ -100,7 +100,7 @@ namespace lms::core }; } - std::string PartialDateTime::toISO8601String() const + std::string PartialDateTime::toString() const { if (_precision == Precision::Invalid) return ""; diff --git a/src/libs/core/impl/String.cpp b/src/libs/core/impl/String.cpp index 418a8d33..8258348a 100644 --- a/src/libs/core/impl/String.cpp +++ b/src/libs/core/impl/String.cpp @@ -471,7 +471,7 @@ namespace lms::core::stringUtils if (dateTime.isValid()) { // assume UTC - return dateTime.toString("yyyy-MM-ddThh:mm:ss.zzz", false).toUTF8(); + return dateTime.toString("yyyy-MM-ddThh:mm:ss.zzz", false).toUTF8() + 'Z'; } return ""; @@ -491,6 +491,9 @@ namespace lms::core::stringUtils Wt::WDateTime fromISO8601String(std::string_view dateTime) { // assume UTC + if (!dateTime.empty() && dateTime.back() == 'Z') + dateTime.remove_suffix(1); + return Wt::WDateTime::fromString(Wt::WString{ std::string{ dateTime } }, "yyyy-MM-ddThh:mm:ss.zzz"); } diff --git a/src/libs/core/include/core/PartialDateTime.hpp b/src/libs/core/include/core/PartialDateTime.hpp index 05947c2e..cf2f3dcd 100644 --- a/src/libs/core/include/core/PartialDateTime.hpp +++ b/src/libs/core/include/core/PartialDateTime.hpp @@ -41,7 +41,7 @@ namespace lms::core static PartialDateTime fromString(std::string_view str); static PartialDateTime fromWtDateTime(const Wt::WDateTime& dateTime); - std::string toISO8601String() const; + std::string toString() const; constexpr bool isValid() const { return _precision != Precision::Invalid; } diff --git a/src/libs/core/test/PartialDateTime.cpp b/src/libs/core/test/PartialDateTime.cpp index cd5b1fc1..702b907d 100644 --- a/src/libs/core/test/PartialDateTime.cpp +++ b/src/libs/core/test/PartialDateTime.cpp @@ -61,21 +61,21 @@ namespace lms::core::stringUtils::tests TEST(PartialDateTime, stringComparison) { - EXPECT_EQ((PartialDateTime{ 1992, 3, 27 }.toISO8601String()), (PartialDateTime{ 1992, 3, 27 }.toISO8601String())); - EXPECT_EQ((PartialDateTime{ 1992, 3 }.toISO8601String()), (PartialDateTime{ 1992, 3 }.toISO8601String())); - EXPECT_EQ(PartialDateTime{ 1992 }.toISO8601String(), PartialDateTime{ 1992 }.toISO8601String()); - EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toISO8601String()), (PartialDateTime{ 1992, 3 }.toISO8601String())); - EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toISO8601String()), (PartialDateTime{ 1992 }.toISO8601String())); - EXPECT_NE((PartialDateTime{ 1992, 3 }.toISO8601String()), (PartialDateTime{ 1992 }.toISO8601String())); - EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toISO8601String()), (PartialDateTime{ 1992, 3, 28 }.toISO8601String())); - EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toISO8601String()), (PartialDateTime{ 1992, 4, 27 }.toISO8601String())); - EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toISO8601String()), (PartialDateTime{ 1993, 3, 27 }.toISO8601String())); - EXPECT_GT((PartialDateTime{ 1993, 3, 28 }.toISO8601String()), (PartialDateTime{ 1993, 3, 27 }.toISO8601String())); - EXPECT_GT((PartialDateTime{ 1993, 4 }.toISO8601String()), (PartialDateTime{ 1993, 3, 27 }.toISO8601String())); - EXPECT_GT((PartialDateTime{ 1994 }.toISO8601String()), (PartialDateTime{ 1993, 3, 27 }.toISO8601String())); - EXPECT_LT((PartialDateTime{ 1993, 3, 27 }.toISO8601String()), (PartialDateTime{ 1993, 3, 28 }.toISO8601String())); - EXPECT_LT((PartialDateTime{ 1993, 3, 27 }.toISO8601String()), (PartialDateTime{ 1993, 4 }.toISO8601String())); - EXPECT_LT((PartialDateTime{ 1993, 3, 27 }.toISO8601String()), (PartialDateTime{ 1994 }.toISO8601String())); + EXPECT_EQ((PartialDateTime{ 1992, 3, 27 }.toString()), (PartialDateTime{ 1992, 3, 27 }.toString())); + EXPECT_EQ((PartialDateTime{ 1992, 3 }.toString()), (PartialDateTime{ 1992, 3 }.toString())); + EXPECT_EQ(PartialDateTime{ 1992 }.toString(), PartialDateTime{ 1992 }.toString()); + EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toString()), (PartialDateTime{ 1992, 3 }.toString())); + EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toString()), (PartialDateTime{ 1992 }.toString())); + EXPECT_NE((PartialDateTime{ 1992, 3 }.toString()), (PartialDateTime{ 1992 }.toString())); + EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toString()), (PartialDateTime{ 1992, 3, 28 }.toString())); + EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toString()), (PartialDateTime{ 1992, 4, 27 }.toString())); + EXPECT_NE((PartialDateTime{ 1992, 3, 27 }.toString()), (PartialDateTime{ 1993, 3, 27 }.toString())); + EXPECT_GT((PartialDateTime{ 1993, 3, 28 }.toString()), (PartialDateTime{ 1993, 3, 27 }.toString())); + EXPECT_GT((PartialDateTime{ 1993, 4 }.toString()), (PartialDateTime{ 1993, 3, 27 }.toString())); + EXPECT_GT((PartialDateTime{ 1994 }.toString()), (PartialDateTime{ 1993, 3, 27 }.toString())); + EXPECT_LT((PartialDateTime{ 1993, 3, 27 }.toString()), (PartialDateTime{ 1993, 3, 28 }.toString())); + EXPECT_LT((PartialDateTime{ 1993, 3, 27 }.toString()), (PartialDateTime{ 1993, 4 }.toString())); + EXPECT_LT((PartialDateTime{ 1993, 3, 27 }.toString()), (PartialDateTime{ 1994 }.toString())); } TEST(PartialDateTime, stringConversions) @@ -120,7 +120,7 @@ namespace lms::core::stringUtils::tests for (const TestCase& test : tests) { const PartialDateTime dateTime{ PartialDateTime::fromString(test.input) }; - EXPECT_EQ(dateTime.toISO8601String(), test.expectedOutput) << "Input = '" << test.input; + EXPECT_EQ(dateTime.toString(), test.expectedOutput) << "Input = '" << test.input; } } } // namespace lms::core::stringUtils::tests diff --git a/src/libs/core/test/String.cpp b/src/libs/core/test/String.cpp index b137854b..51075fc8 100644 --- a/src/libs/core/test/String.cpp +++ b/src/libs/core/test/String.cpp @@ -316,12 +316,12 @@ namespace lms::core::stringUtils::tests { { const Wt::WDateTime dateTime{ Wt::WDate{ 2020, 01, 03 }, Wt::WTime{ 9, 8, 11, 75 } }; - EXPECT_EQ(toISO8601String(dateTime), "2020-01-03T09:08:11.075"); + EXPECT_EQ(toISO8601String(dateTime), "2020-01-03T09:08:11.075Z"); } { const Wt::WDateTime dateTime{ Wt::WDate{ 2020, 01, 03 } }; - EXPECT_EQ(toISO8601String(dateTime), "2020-01-03T00:00:00.000"); + EXPECT_EQ(toISO8601String(dateTime), "2020-01-03T00:00:00.000Z"); } { @@ -332,6 +332,7 @@ namespace lms::core::stringUtils::tests TEST(Stringutils, DateTimeFromString) { + EXPECT_EQ(fromISO8601String("2020-01-03T09:08:11.075Z"), (Wt::WDateTime{ Wt::WDate{ 2020, 01, 03 }, Wt::WTime{ 9, 8, 11, 75 } })); EXPECT_EQ(fromISO8601String("2020-01-03T09:08:11.075"), (Wt::WDateTime{ Wt::WDate{ 2020, 01, 03 }, Wt::WTime{ 9, 8, 11, 75 } })); EXPECT_EQ(fromISO8601String("2020-01-03"), Wt::WDateTime{}); EXPECT_EQ(fromISO8601String(""), Wt::WDateTime{}); diff --git a/src/libs/database/impl/traits/PartialDateTimeTraits.hpp b/src/libs/database/impl/traits/PartialDateTimeTraits.hpp index f2b35ace..9df4efa1 100644 --- a/src/libs/database/impl/traits/PartialDateTimeTraits.hpp +++ b/src/libs/database/impl/traits/PartialDateTimeTraits.hpp @@ -38,7 +38,7 @@ namespace Wt::Dbo if (!dateTime.isValid()) statement->bindNull(column); else - statement->bind(column, dateTime.toISO8601String()); + statement->bind(column, dateTime.toString()); } static bool read(lms::core::PartialDateTime& dateTime, SqlStatement* statement, int column, int size) diff --git a/src/tools/metadata/LmsMetadata.cpp b/src/tools/metadata/LmsMetadata.cpp index 15234522..44904722 100644 --- a/src/tools/metadata/LmsMetadata.cpp +++ b/src/tools/metadata/LmsMetadata.cpp @@ -306,10 +306,10 @@ namespace lms::metadata std::cout << "Position: " << *track->position << std::endl; if (track->date.isValid()) - std::cout << "Date: " << track->date.toISO8601String() << std::endl; + std::cout << "Date: " << track->date.toString() << std::endl; if (track->originalDate.isValid()) - std::cout << "Original date: " << track->originalDate.toISO8601String() << std::endl; + std::cout << "Original date: " << track->originalDate.toString() << std::endl; if (track->originalYear) std::cout << "Original year: " << *track->originalYear << std::endl; @@ -336,7 +336,7 @@ namespace lms::metadata std::cout << "Advisory: " << *track->advisory << std::endl; if (track->encodingTime.isValid()) - std::cout << "Encoding time: " << track->encodingTime.toISO8601String() << std::endl; + std::cout << "Encoding time: " << track->encodingTime.toString() << std::endl; if (track->medium) std::cout << "Medium: " << *track->medium;