try to enhance new approach to datetime parsing

This commit is contained in:
Martin Rotter 2024-05-17 09:34:21 +02:00
parent 526c4d62d3
commit f8e09fa589
20 changed files with 115 additions and 73 deletions

View file

@ -511,7 +511,7 @@ void GmailNetworkFactory::onAuthFailed() {
}});
}
bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id) const {
bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id) {
// Assign correct main labels/states.
auto labelids = json[QSL("labelIds")].toArray().toVariantList();
@ -569,10 +569,10 @@ bool GmailNetworkFactory::fillFullMessage(Message& msg, const QJsonObject& json,
msg.m_url = QSL("https://mail.google.com/mail/u/0/#all/%1").arg(msg.m_customId);
msg.m_createdFromFeed = true;
msg.m_created = TextFactory::parseDateTime(headers[QSL("Date")]);
msg.m_created = TextFactory::parseDateTime(headers[QSL("Date")], &m_dateTimeFormat);
if (!msg.m_created.isValid()) {
msg.m_created = TextFactory::parseDateTime(headers[QSL("date")]);
msg.m_created = TextFactory::parseDateTime(headers[QSL("date")], &m_dateTimeFormat);
}
if (msg.m_title.isEmpty()) {
@ -695,7 +695,7 @@ QMap<QString, QString> GmailNetworkFactory::getMessageMetadata(const QString& ms
QList<Message> GmailNetworkFactory::obtainAndDecodeFullMessages(const QStringList& message_ids,
const QString& feed_id,
const QNetworkProxy& custom_proxy) const {
const QNetworkProxy& custom_proxy) {
QHash<QString, Message> msgs;
int next_message = 0;
QString bearer = m_oauth2->bearer();

View file

@ -74,10 +74,10 @@ class GmailNetworkFactory : public QObject {
void onAuthFailed();
private:
bool fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id) const;
bool fillFullMessage(Message& msg, const QJsonObject& json, const QString& feed_id);
QList<Message> obtainAndDecodeFullMessages(const QStringList& message_ids,
const QString& feed_id,
const QNetworkProxy& custom_proxy) const;
const QNetworkProxy& custom_proxy);
QStringList decodeLiteMessages(const QString& messages_json_data, QString& next_page_token) const;
QString sanitizeEmailAuthor(const QString& author) const;
@ -86,6 +86,7 @@ class GmailNetworkFactory : public QObject {
private:
GmailServiceRoot* m_service;
QString m_username;
QString m_dateTimeFormat;
int m_batchSize;
bool m_downloadOnlyUnreadMessages;
OAuth2Service* m_oauth2;

View file

@ -334,14 +334,14 @@ QString AtomParser::xmlMessageDescription(const QDomElement& msg_element) const
return summary;
}
QDateTime AtomParser::xmlMessageDateCreated(const QDomElement& msg_element) const {
QDateTime AtomParser::xmlMessageDateCreated(const QDomElement& msg_element) {
QString updated = xmlTextsFromPath(msg_element, m_atomNamespace, QSL("updated"), true).join(QSL(", "));
if (updated.simplified().isEmpty()) {
updated = xmlTextsFromPath(msg_element, m_atomNamespace, QSL("modified"), true).join(QSL(", "));
}
return TextFactory::parseDateTime(updated);
return TextFactory::parseDateTime(updated, &m_dateTimeFormat);
}
QString AtomParser::xmlMessageId(const QDomElement& msg_element) const {

View file

@ -26,7 +26,7 @@ class AtomParser : public FeedParser {
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element);
virtual QString xmlMessageId(const QDomElement& msg_element) const;
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;

View file

@ -15,6 +15,8 @@
#include <QFile>
#include <QRegularExpression>
FeedParser::FeedParser() {}
FeedParser::FeedParser(QString data, DataType is_xml)
: m_dataType(is_xml), m_data(std::move(data)), m_mrssNamespace(QSL("http://search.yahoo.com/mrss/")) {
if (m_data.isEmpty()) {
@ -104,7 +106,7 @@ QString FeedParser::jsonMessageAuthor(const QJsonObject& msg_element) const {
return {};
}
QDateTime FeedParser::jsonMessageDateCreated(const QJsonObject& msg_element) const {
QDateTime FeedParser::jsonMessageDateCreated(const QJsonObject& msg_element) {
return {};
}
@ -136,7 +138,7 @@ QString FeedParser::objMessageUrl(const QVariant& msg_element) const {
return {};
}
QString FeedParser::objMessageDescription(const QVariant& msg_element) const {
QString FeedParser::objMessageDescription(const QVariant& msg_element) {
return {};
}
@ -144,7 +146,7 @@ QString FeedParser::objMessageAuthor(const QVariant& msg_element) const {
return {};
}
QDateTime FeedParser::objMessageDateCreated(const QVariant& msg_element) const {
QDateTime FeedParser::objMessageDateCreated(const QVariant& msg_element) {
return {};
}
@ -398,6 +400,14 @@ QStringList FeedParser::xmlTextsFromPath(const QDomElement& element,
return result;
}
QString FeedParser::dateTimeFormat() const {
return m_dateTimeFormat;
}
void FeedParser::setDateTimeFormat(const QString& dt_format) {
m_dateTimeFormat = dt_format;
}
QString FeedParser::feedAuthor() const {
return QL1S("");
}
@ -422,7 +432,7 @@ QString FeedParser::xmlMessageAuthor(const QDomElement& msg_element) const {
return {};
}
QDateTime FeedParser::xmlMessageDateCreated(const QDomElement& msg_element) const {
QDateTime FeedParser::xmlMessageDateCreated(const QDomElement& msg_element) {
return {};
}

View file

@ -23,6 +23,7 @@ class FeedParser {
Other
};
FeedParser();
explicit FeedParser(QString data, DataType is_xml = DataType::Xml);
virtual ~FeedParser();
@ -36,6 +37,9 @@ class FeedParser {
// Returns list of all messages from the feed.
virtual QList<Message> messages();
QString dateTimeFormat() const;
void setDateTimeFormat(const QString& dt_format);
protected:
virtual QString feedAuthor() const;
@ -45,7 +49,7 @@ class FeedParser {
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
virtual QString xmlMessageAuthor(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element);
virtual QString xmlMessageId(const QDomElement& msg_element) const;
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;
virtual QList<MessageCategory> xmlMessageCategories(const QDomElement& msg_element) const;
@ -57,7 +61,7 @@ class FeedParser {
virtual QString jsonMessageUrl(const QJsonObject& msg_element) const;
virtual QString jsonMessageDescription(const QJsonObject& msg_element) const;
virtual QString jsonMessageAuthor(const QJsonObject& msg_element) const;
virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) const;
virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) ;
virtual QString jsonMessageId(const QJsonObject& msg_element) const;
virtual QList<Enclosure> jsonMessageEnclosures(const QJsonObject& msg_element) const;
virtual QList<MessageCategory> jsonMessageCategories(const QJsonObject& msg_element) const;
@ -67,9 +71,9 @@ class FeedParser {
virtual QVariantList objMessageElements();
virtual QString objMessageTitle(const QVariant& msg_element) const;
virtual QString objMessageUrl(const QVariant& msg_element) const;
virtual QString objMessageDescription(const QVariant& msg_element) const;
virtual QString objMessageDescription(const QVariant& msg_element) ;
virtual QString objMessageAuthor(const QVariant& msg_element) const;
virtual QDateTime objMessageDateCreated(const QVariant& msg_element) const;
virtual QDateTime objMessageDateCreated(const QVariant& msg_element) ;
virtual QString objMessageId(const QVariant& msg_element) const;
virtual QList<Enclosure> objMessageEnclosures(const QVariant& msg_element) const;
virtual QList<MessageCategory> objMessageCategories(const QVariant& msg_element) const;
@ -87,6 +91,7 @@ class FeedParser {
protected:
DataType m_dataType;
QString m_data;
QString m_dateTimeFormat;
QDomDocument m_xml;
QJsonDocument m_json;
QString m_mrssNamespace;

View file

@ -106,17 +106,17 @@ QString IcalParser::objMessageUrl(const QVariant& msg_element) const {
return comp.url();
}
QString IcalParser::objMessageDescription(const QVariant& msg_element) const {
QString IcalParser::objMessageDescription(const QVariant& msg_element) {
const IcalendarComponent& comp_base = msg_element.value<IcalendarComponent>();
const EventComponent& comp = static_cast<const EventComponent&>(comp_base);
bool has_dt;
auto son = comp.startsOn(m_iCalendar.m_tzs, &has_dt).toLocalTime();
auto son = comp.startsOn(m_iCalendar.m_tzs, &has_dt, &m_dateTimeFormat).toLocalTime();
QString formaton = has_dt ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat)
: QLocale().dateFormat(QLocale::FormatType::LongFormat);
auto soff = comp.endsOn(m_iCalendar.m_tzs, &has_dt).toLocalTime();
auto soff = comp.endsOn(m_iCalendar.m_tzs, &has_dt, &m_dateTimeFormat).toLocalTime();
QString formatoff = has_dt ? QLocale().dateTimeFormat(QLocale::FormatType::LongFormat)
: QLocale().dateFormat(QLocale::FormatType::LongFormat);
@ -142,11 +142,11 @@ QString IcalParser::objMessageAuthor(const QVariant& msg_element) const {
return comp.organizer();
}
QDateTime IcalParser::objMessageDateCreated(const QVariant& msg_element) const {
QDateTime IcalParser::objMessageDateCreated(const QVariant& msg_element) {
const IcalendarComponent& comp_base = msg_element.value<IcalendarComponent>();
const EventComponent& comp = static_cast<const EventComponent&>(comp_base);
QDateTime dat = comp.startsOn(m_iCalendar.m_tzs);
QDateTime dat = comp.startsOn(m_iCalendar.m_tzs, nullptr, &m_dateTimeFormat);
return dat;
}
@ -347,13 +347,12 @@ QDateTime IcalendarComponent::fixupDate(QDateTime dat,
}
}
QDateTime EventComponent::startsOn(const QMap<QString, QTimeZone>& time_zones, bool* had_dt) const {
QDateTime EventComponent::startsOn(const QMap<QString, QTimeZone>& time_zones, bool* had_dt, QString* dt_format) const {
QString modifiers;
QString dt_format;
bool has_dt;
QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTSTART"), modifiers).toString(), &dt_format);
QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTSTART"), modifiers).toString(), dt_format);
dat = fixupDate(dat, dt_format, time_zones, modifiers, &has_dt);
dat = fixupDate(dat, *dt_format, time_zones, modifiers, &has_dt);
if (had_dt != nullptr) {
*had_dt = has_dt;
@ -362,13 +361,12 @@ QDateTime EventComponent::startsOn(const QMap<QString, QTimeZone>& time_zones, b
return dat;
}
QDateTime EventComponent::endsOn(const QMap<QString, QTimeZone>& time_zones, bool* had_dt) const {
QDateTime EventComponent::endsOn(const QMap<QString, QTimeZone>& time_zones, bool* had_dt, QString* dt_format) const {
QString modifiers;
QString dt_format;
bool has_dt;
QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTEND"), modifiers).toString(), &dt_format);
QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("DTEND"), modifiers).toString(), dt_format);
dat = fixupDate(dat, dt_format, time_zones, modifiers, &has_dt);
dat = fixupDate(dat, *dt_format, time_zones, modifiers, &has_dt);
if (had_dt != nullptr) {
*had_dt = has_dt;
@ -396,17 +394,3 @@ QString EventComponent::location() const {
QString EventComponent::description() const {
return getPropertyValue(QSL("DESCRIPTION")).toString();
}
QDateTime EventComponent::created(const QMap<QString, QTimeZone>& time_zones) const {
QString modifiers;
QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("CREATED"), modifiers).toString());
return fixupDate(dat, {}, time_zones, modifiers);
}
QDateTime EventComponent::lastModified(const QMap<QString, QTimeZone>& time_zones) const {
QString modifiers;
QDateTime dat = TextFactory::parseDateTime(getPropertyValue(QSL("LAST-MODIFIED"), modifiers).toString());
return fixupDate(dat, {}, time_zones, modifiers);
}

View file

@ -31,15 +31,17 @@ Q_DECLARE_METATYPE(IcalendarComponent)
class EventComponent : public IcalendarComponent {
public:
QDateTime startsOn(const QMap<QString, QTimeZone>& time_zones = {}, bool* had_dt = nullptr) const;
QDateTime endsOn(const QMap<QString, QTimeZone>& time_zones = {}, bool* had_dt = nullptr) const;
QDateTime startsOn(const QMap<QString, QTimeZone>& time_zones = {},
bool* had_dt = nullptr,
QString* dt_format = nullptr) const;
QDateTime endsOn(const QMap<QString, QTimeZone>& time_zones = {},
bool* had_dt = nullptr,
QString* dt_format = nullptr) const;
QString title() const;
QString url() const;
QString organizer() const;
QString location() const;
QString description() const;
QDateTime created(const QMap<QString, QTimeZone>& time_zones = {}) const;
QDateTime lastModified(const QMap<QString, QTimeZone>& time_zones = {}) const;
};
Q_DECLARE_METATYPE(EventComponent)
@ -81,9 +83,9 @@ class IcalParser : public FeedParser {
virtual QVariantList objMessageElements();
virtual QString objMessageTitle(const QVariant& msg_element) const;
virtual QString objMessageUrl(const QVariant& msg_element) const;
virtual QString objMessageDescription(const QVariant& msg_element) const;
virtual QString objMessageDescription(const QVariant& msg_element);
virtual QString objMessageAuthor(const QVariant& msg_element) const;
virtual QDateTime objMessageDateCreated(const QVariant& msg_element) const;
virtual QDateTime objMessageDateCreated(const QVariant& msg_element);
virtual QString objMessageId(const QVariant& msg_element) const;
virtual QList<Enclosure> objMessageEnclosures(const QVariant& msg_element) const;
virtual QList<MessageCategory> objMessageCategories(const QVariant& msg_element) const;

View file

@ -199,10 +199,11 @@ QString JsonParser::jsonMessageAuthor(const QJsonObject& msg_element) const {
}
}
QDateTime JsonParser::jsonMessageDateCreated(const QJsonObject& msg_element) const {
QDateTime JsonParser::jsonMessageDateCreated(const QJsonObject& msg_element) {
return TextFactory::parseDateTime(msg_element.contains(QSL("date_modified"))
? msg_element[QSL("date_modified")].toString()
: msg_element[QSL("date_published")].toString());
: msg_element[QSL("date_published")].toString(),
&m_dateTimeFormat);
}
QString JsonParser::jsonMessageId(const QJsonObject& msg_element) const {

View file

@ -25,7 +25,7 @@ class JsonParser : public FeedParser {
virtual QString jsonMessageUrl(const QJsonObject& msg_element) const;
virtual QString jsonMessageDescription(const QJsonObject& msg_element) const;
virtual QString jsonMessageAuthor(const QJsonObject& msg_element) const;
virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) const;
virtual QDateTime jsonMessageDateCreated(const QJsonObject& msg_element) ;
virtual QString jsonMessageId(const QJsonObject& msg_element) const;
virtual QList<Enclosure> jsonMessageEnclosures(const QJsonObject& msg_element) const;
virtual QString jsonMessageRawContents(const QJsonObject& msg_element) const;

View file

@ -257,11 +257,12 @@ QString RdfParser::xmlMessageAuthor(const QDomElement& msg_element) const {
return msg_element.elementsByTagNameNS(m_dcElNamespace, QSL("creator")).at(0).toElement().text();
}
QDateTime RdfParser::xmlMessageDateCreated(const QDomElement& msg_element) const {
QDateTime RdfParser::xmlMessageDateCreated(const QDomElement& msg_element) {
return TextFactory::parseDateTime(msg_element.elementsByTagNameNS(m_dcElNamespace, QSL("date"))
.at(0)
.toElement()
.text());
.text(),
&m_dateTimeFormat);
}
QString RdfParser::xmlMessageId(const QDomElement& msg_element) const {

View file

@ -23,7 +23,7 @@ class RdfParser : public FeedParser {
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
virtual QString xmlMessageAuthor(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element);
virtual QString xmlMessageId(const QDomElement& msg_element) const;
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;

View file

@ -280,15 +280,17 @@ QString RssParser::xmlMessageAuthor(const QDomElement& msg_element) const {
return author;
}
QDateTime RssParser::xmlMessageDateCreated(const QDomElement& msg_element) const {
QDateTime date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("pubDate")).toElement().text());
QDateTime RssParser::xmlMessageDateCreated(const QDomElement& msg_element) {
QDateTime date_created =
TextFactory::parseDateTime(msg_element.namedItem(QSL("pubDate")).toElement().text(), &m_dateTimeFormat);
if (date_created.isNull()) {
date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("date")).toElement().text());
date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("date")).toElement().text(), &m_dateTimeFormat);
}
if (date_created.isNull()) {
date_created = TextFactory::parseDateTime(msg_element.namedItem(QSL("dc:modified")).toElement().text());
date_created =
TextFactory::parseDateTime(msg_element.namedItem(QSL("dc:modified")).toElement().text(), &m_dateTimeFormat);
}
return date_created;

View file

@ -24,7 +24,7 @@ class RssParser : public FeedParser {
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
virtual QString xmlMessageAuthor(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element);
virtual QString xmlMessageId(const QDomElement& msg_element) const;
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;

View file

@ -263,7 +263,7 @@ QString SitemapParser::xmlMessageDescription(const QDomElement& msg_element) con
return xmlRawChild(msg_element.elementsByTagNameNS(sitemapVideoNamespace(), QSL("description")).at(0).toElement());
}
QDateTime SitemapParser::xmlMessageDateCreated(const QDomElement& msg_element) const {
QDateTime SitemapParser::xmlMessageDateCreated(const QDomElement& msg_element) {
QString str_date = msg_element.elementsByTagNameNS(sitemapNamespace(), QSL("lastmod")).at(0).toElement().text();
if (str_date.isEmpty()) {
@ -271,7 +271,7 @@ QDateTime SitemapParser::xmlMessageDateCreated(const QDomElement& msg_element) c
msg_element.elementsByTagNameNS(sitemapNewsNamespace(), QSL("publication_date")).at(0).toElement().text();
}
return TextFactory::parseDateTime(str_date);
return TextFactory::parseDateTime(str_date, &m_dateTimeFormat);
}
QString SitemapParser::xmlMessageId(const QDomElement& msg_element) const {

View file

@ -23,7 +23,7 @@ class SitemapParser : public FeedParser {
virtual QString xmlMessageTitle(const QDomElement& msg_element) const;
virtual QString xmlMessageUrl(const QDomElement& msg_element) const;
virtual QString xmlMessageDescription(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element) const;
virtual QDateTime xmlMessageDateCreated(const QDomElement& msg_element);
virtual QString xmlMessageId(const QDomElement& msg_element) const;
virtual QList<Enclosure> xmlMessageEnclosures(const QDomElement& msg_element) const;

View file

@ -426,6 +426,14 @@ bool StandardFeed::removeItself() {
return DatabaseQueries::deleteFeed(database, this, getParentServiceRoot()->accountId());
}
QString StandardFeed::dateTimeFormat() const {
return m_dateTimeFormat;
}
void StandardFeed::setDateTimeFormat(const QString& dt_format) {
m_dateTimeFormat = dt_format;
}
QString StandardFeed::lastEtag() const {
return m_lastEtag;
}

View file

@ -107,6 +107,9 @@ class StandardFeed : public Feed {
QString lastEtag() const;
void setLastEtag(const QString& etag);
QString dateTimeFormat() const;
void setDateTimeFormat(const QString& dt_format);
public slots:
void fetchMetadataForItself();
@ -119,6 +122,7 @@ class StandardFeed : public Feed {
Type m_type;
QString m_postProcessScript;
QString m_encoding;
QString m_dateTimeFormat;
NetworkFactory::NetworkAuthentication m_protection = NetworkFactory::NetworkAuthentication::NoAuthentication;
QString m_username;
QString m_password;

View file

@ -322,36 +322,50 @@ QList<Message> StandardServiceRoot::obtainNewMessages(Feed* feed,
// Feed data are downloaded and encoded.
// Parse data and obtain messages.
QList<Message> messages;
FeedParser* parser;
switch (f->type()) {
case StandardFeed::Type::Rss0X:
case StandardFeed::Type::Rss2X:
messages = RssParser(formatted_feed_contents).messages();
parser = new RssParser(formatted_feed_contents);
break;
case StandardFeed::Type::Rdf:
messages = RdfParser(formatted_feed_contents).messages();
parser = new RdfParser(formatted_feed_contents);
break;
case StandardFeed::Type::Atom10:
messages = AtomParser(formatted_feed_contents).messages();
parser = new AtomParser(formatted_feed_contents);
break;
case StandardFeed::Type::Json:
messages = JsonParser(formatted_feed_contents).messages();
parser = new JsonParser(formatted_feed_contents);
break;
case StandardFeed::Type::iCalendar:
messages = IcalParser(formatted_feed_contents).messages();
parser = new IcalParser(formatted_feed_contents);
break;
case StandardFeed::Type::Sitemap:
messages = SitemapParser(formatted_feed_contents).messages();
parser = new SitemapParser(formatted_feed_contents);
break;
default:
break;
}
if (!f->dateTimeFormat().isEmpty()) {
parser->setDateTimeFormat(f->dateTimeFormat());
}
messages = parser->messages();
if (!parser->dateTimeFormat().isEmpty()) {
f->setDateTimeFormat(parser->dateTimeFormat());
}
delete parser;
for (Message& mess : messages) {
mess.m_feedId = feed->customId();
}

View file

@ -87,9 +87,15 @@ QDateTime TextFactory::parseDateTime(const QString& date_time, QString* used_dt_
return QDateTime();
}
QLocale locale(QLocale::Language::C);
QStringList built_in_patterns = dateTimePatterns(true);
QDateTime dt;
static QLocale locale(QLocale::Language::C);
static QStringList date_patterns = dateTimePatterns(true);
QStringList date_patterns = built_in_patterns;
if (used_dt_format != nullptr && !used_dt_format->isEmpty()) {
built_in_patterns.prepend(*used_dt_format);
}
// QDateTime dt1 = locale.toDateTime("GMT", "t");
// QString dt2 = dt1.toString();
@ -126,12 +132,16 @@ QStringList TextFactory::dateTimePatterns(bool with_tzs) {
QStringList pat;
pat << QSL("yyyy-MM-ddTHH:mm:ss");
pat << QSL("yyyy-MM-ddTHH:mm:ss.zzz");
pat << QSL("yyyy-MM-ddThh:mm:ss");
pat << QSL("yyyy-MM-dd HH:mm:ss.z");
pat << QSL("yyyy-MM-ddThh:mm");
pat << QSL("yyyyMMddThhmmss");
pat << QSL("yyyyMMdd");
pat << QSL("yyyy");
pat << QSL("yyyy-MM-dd");
pat << QSL("yyyy-MM");
@ -143,7 +153,7 @@ QStringList TextFactory::dateTimePatterns(bool with_tzs) {
pat << QSL("ddd, dd MMM yy HH:mm:ss");
pat << QSL("ddd, d MMM yyyy HH:mm:ss");
// Thu, 07 Mar 2024 01 : 12 : 13 GMT
pat << QSL("ddd, MM/dd/yyyy - HH:mm");
pat << QSL("dd MMM yyyy hh:mm:ss");
pat << QSL("dd MMM yyyy");