Customise locale default date format to ensure we eliminate issues parsing two-digit...
authorClaudio Cambra <claudio.cambra@nextcloud.com>
Tue, 8 Aug 2023 09:27:11 +0000 (17:27 +0800)
committerbackportbot-nextcloud[bot] <backportbot-nextcloud[bot]@users.noreply.github.com>
Wed, 13 Sep 2023 08:47:54 +0000 (08:47 +0000)
Signed-off-by: Claudio Cambra <claudio.cambra@nextcloud.com>
src/gui/filedetails/datefieldbackend.cpp
src/gui/filedetails/datefieldbackend.h

index 0764ac2e1072ddde3c12b719bff5914356cbcb14..8377afad9374998ebac83b19ce12ca8feea797e2 100644 (file)
 #include "datefieldbackend.h"
 
 #include <QLocale>
+#include <QRegularExpression>
 
 namespace OCC
 {
 namespace Quick
 {
 
+DateFieldBackend::DateFieldBackend(QObject *const parent)
+    : QObject(parent)
+{
+    // Ensure the date format is for a full year. QLocale::ShortFormat often
+    // provides a short year format that is only two years, which is an absolute
+    // pain to work with -- ensure instead we have the full, unambiguous year
+    _dateFormat = QLocale::system().dateFormat(QLocale::ShortFormat);
+    // Check for specifically two y's, no more and no fewer, within format date
+    const QRegularExpression re("(?<!y)y{2}(?!y)");
+
+    if (auto match = re.match(_dateFormat); match.hasMatch()) {
+        _dateFormat.replace(match.capturedStart(), match.capturedLength(), "yyyy");
+    }
+}
+
 QDateTime DateFieldBackend::dateTime() const
 {
     return _dateTime;
@@ -53,14 +69,13 @@ void DateFieldBackend::setDateTimeMsecs(const qint64 dateTimeMsecs)
 
 QString DateFieldBackend::dateTimeString() const
 {
-    const auto locale = QLocale::system();
-    return _dateTime.toString(locale.dateFormat(QLocale::ShortFormat));
+    return _dateTime.toString(_dateFormat);
 }
 
 void DateFieldBackend::setDateTimeString(const QString &dateTimeString)
 {
     const auto locale = QLocale::system();
-    const auto dt = locale.toDateTime(dateTimeString, locale.dateFormat(QLocale::ShortFormat));
+    const auto dt = locale.toDateTime(dateTimeString, _dateFormat);
     setDateTime(dt);
 }
 
index dde64187fb2a4d78ed813ef13831671c8f4ca854..d0df944ef5dfb6c8f54f21adaece0e58c09054a9 100644 (file)
@@ -39,7 +39,7 @@ class DateFieldBackend : public QObject
     Q_PROPERTY(bool validDateTime READ validDateTime NOTIFY dateTimeChanged NOTIFY minimumDateTimeChanged NOTIFY maximumDateTimeChanged)
 
 public:
-    explicit DateFieldBackend() = default;
+    explicit DateFieldBackend(QObject *const parent = nullptr);
 
     [[nodiscard]] QDateTime dateTime() const;
     [[nodiscard]] qint64 dateTimeMsecs() const;
@@ -73,6 +73,8 @@ private:
     QDateTime _dateTime = QDateTime::currentDateTimeUtc();
     QDateTime _minimumDateTime;
     QDateTime _maximumDateTime;
+
+    QString _dateFormat;
 };
 
 } // namespace Quick