Revision control
Copy as Markdown
// Copyright (C) 2026 The Qt Company Ltd.
// SPDX-License-Identifier: LicenseRef-Qt-Commercial OR LGPL-3.0-only OR GPL-2.0-only OR GPL-3.0-only
// Qt-Security score:significant reason:default
#ifndef QPARSE_TIMEZONE_P_H
#define QPARSE_TIMEZONE_P_H
//
// W A R N I N G
// -------------
//
// This file is not part of the Qt API. It exists purely as an
// implementation detail. This header file may change from version to
// version without notice, or even be removed.
//
// We mean it.
//
#include <QtCore/private/qtparsecommon_p.h>
#include <QtCore/private/qdatetime_p.h>
#include <QtCore/qflags.h>
#include <QtCore/qlocale.h>
#include <QtCore/qtimezone.h>
#include <QtCore/private/qttemporalpattern_p.h>
QT_REQUIRE_CONFIG(datetimeparser);
QT_BEGIN_NAMESPACE
namespace QtParseTimeZone {
struct ParsedZone : public QtParseCommon::ParsedText
{
QTimeZone zone{QTimeZone::LocalTime};
QDateTimePrivate::DaylightStatus timeType = QDateTimePrivate::UnknownDaylightTime;
constexpr QDateTime::TransitionResolution resolveType() const noexcept
{
// How to resolve QDateTime construction to favour the timeType parsed:
using Res = QDateTime::TransitionResolution;
switch (timeType) {
case QDateTimePrivate::StandardTime: return Res::PreferStandard;
case QDateTimePrivate::DaylightTime: return Res::PreferDaylightSaving;
case QDateTimePrivate::UnknownDaylightTime: return Res::LegacyBehavior;
}
Q_UNREACHABLE_RETURN(Res::LegacyBehavior);
}
};
constexpr QtTemporalPattern::TemporalFieldFlags AnyOffsetForm{
QtTemporalPattern::TemporalFieldFlag::Numeric };
constexpr QtTemporalPattern::TemporalFieldFlags AnyGlobalZoneName{
QtTemporalPattern::TemporalFieldFlag::Verbal
| QtTemporalPattern::TemporalFieldFlag::Standalone };
// Corresponding to QDTP::findTimeZone's modes (count('t') in Qt format field):
constexpr QtTemporalPattern::TemporalFieldFlags AnyZoneName{
AnyGlobalZoneName | QtTemporalPattern::TemporalFieldFlag::LocalTimeName }; // mode 4
constexpr QtTemporalPattern::TemporalFieldFlags BasicColonDigitOffset{ // mode 3
QtTemporalPattern::TemporalFieldFlag::Numeric
| QtTemporalPattern::TemporalFieldFlag::Abbreviated
| QtTemporalPattern::TemporalFieldFlag::Narrow };
// TODO: distinguish modes 2 and 3
constexpr QtTemporalPattern::TemporalFieldFlags BasicDigitOnlyOffset{ // mode 2
QtTemporalPattern::TemporalFieldFlag::Numeric
| QtTemporalPattern::TemporalFieldFlag::Abbreviated
| QtTemporalPattern::TemporalFieldFlag::Narrow };
constexpr QtTemporalPattern::TemporalFieldFlags AllLegacyForm{ // mode 1
QtTemporalPattern::TemporalFieldFlag::AllowZSuffix | BasicDigitOnlyOffset | BasicColonDigitOffset
| QtTemporalPattern::TemporalFieldFlag::Wide
| QtTemporalPattern::TemporalFieldFlag::Short | AnyZoneName };
constexpr QtTemporalPattern::TemporalFieldFlags AnyGlobalZoneForm{
QtTemporalPattern::TemporalFieldFlag::AllowZSuffix | AnyOffsetForm | AnyGlobalZoneName };
constexpr QtTemporalPattern::TemporalFieldFlags AnyZoneForm{
QtTemporalPattern::TemporalFieldFlag::AllowZSuffix | AnyOffsetForm | AnyZoneName };
// Parsing functions return lists, sorted with "better" matches earlier; for
// now, longer is better.
Q_AUTOTEST_EXPORT // so that we can test it
QList<ParsedZone> prefix(QStringView text, const QLocale &locale, qsizetype from = 0,
QtTemporalPattern::TemporalFieldFlags flags = AnyZoneForm);
// QList<ParsedZone> find(QStringView text, const QLocale &locale, qsizetype from = 0,
// QtTemporalPattern::TemporalFieldFlags flags = AnyZoneForm);
} // QtParseTimeZone
QT_END_NAMESPACE
#endif // QPARSE_TIMEZONE_P_H