aboutsummaryrefslogtreecommitdiffstats
path: root/src/qml/jsruntime/qv4dateobject.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/qml/jsruntime/qv4dateobject.cpp')
-rw-r--r--src/qml/jsruntime/qv4dateobject.cpp137
1 files changed, 4 insertions, 133 deletions
diff --git a/src/qml/jsruntime/qv4dateobject.cpp b/src/qml/jsruntime/qv4dateobject.cpp
index d366f5909a..c0bf5f9afa 100644
--- a/src/qml/jsruntime/qv4dateobject.cpp
+++ b/src/qml/jsruntime/qv4dateobject.cpp
@@ -1,6 +1,6 @@
/****************************************************************************
**
-** Copyright (C) 2021 The Qt Company Ltd.
+** Copyright (C) 2022 The Qt Company Ltd.
** Contact: https://www.qt.io/licensing/
**
** This file is part of the QtQml module of the Qt Toolkit.
@@ -37,7 +37,6 @@
**
****************************************************************************/
-
#include "qv4dateobject_p.h"
#include "qv4objectproto_p.h"
#include "qv4scopedvalue_p.h"
@@ -48,64 +47,11 @@
#include <QtCore/QDebug>
#include <QtCore/QDateTime>
+#include <QtCore/private/qlocaltime_p.h>
#include <QtCore/QStringList>
-#include <time.h>
-
#include <wtf/MathExtras.h>
-#if QT_CONFIG(timezone) && !defined(Q_OS_WIN)
-/*
- See QTBUG-56899. Although we don't (yet) have a proper way to reset the
- system zone, the code below, that uses QTimeZone::systemTimeZone(), works
- adequately on Linux.
-
- QTimeZone::systemTimeZone() will automatically produce an updated value on
- non-android Linux systems when the TZ environment variable or the relevant
- files in /etc are changed. On other platforms it won't, and the information
- produced here may be incorrect after changes to the system time zone.
-
- We accept this defect for now because the localtime_r approach will
- consistently produce incorrect results for some time zones, not only when
- the system time zone changes. This is a worse problem, see also QTBUG-84474.
-
- On windows we have a better implementation of getLocalTZA that hopefully
- updates on time zone changes. However, we currently use the worse
- implementation of DaylightSavingTA (returning either an hour or 0).
-
- QTimeZone::systemTimeZone() on Linux is also slower than other approaches
- because it has to poll the relevant files (if TZ is not set). See
- QTBUG-75585 for an explanation and possible workarounds.
- */
-#define USE_QTZ_SYSTEM_ZONE
-#elif defined(Q_OS_WASM)
-/*
- TODO: evaluate using this version of the code more generally, rather than
- the #else branches of the various USE_QTZ_SYSTEM_ZONE choices. It might even
- work better than the timezone variant; experiments needed.
-*/
-// Kludge around the lack of time-zone info using QDateTime.
-// It uses localtime() and friends to determine offsets from UTC.
-#define USE_QDT_LOCAL_TIME
-#endif
-
-#ifdef USE_QTZ_SYSTEM_ZONE
-#include <QtCore/QTimeZone>
-#elif defined(USE_QDT_LOCAL_TIME)
-// QDateTime already included above
-#else
-# ifdef Q_OS_WIN
-# include <qt_windows.h>
-# else
-# ifndef Q_OS_VXWORKS
-# include <sys/time.h>
-# else
-# include "qplatformdefs.h"
-# endif
-# include <unistd.h> // for _POSIX_THREAD_SAFE_FUNCTIONS
-# endif
-#endif // USE_QTZ_SYSTEM_ZONE
-
using namespace QV4;
static const double HoursPerDay = 24.0;
@@ -351,7 +297,6 @@ static inline double MakeDate(double day, double time)
return day * msPerDay + time;
}
-#ifdef USE_QTZ_SYSTEM_ZONE
/*
ECMAScript specifies use of a fixed (current, standard) time-zone offset,
LocalTZA; and LocalTZA + DaylightSavingTA(t) is taken to be (see LocalTime and
@@ -369,42 +314,10 @@ static inline double MakeDate(double day, double time)
against the ECMAScript spec is https://github.com/tc39/ecma262/issues/725
and they've now changed the spec so that the following conforms to it ;^>
*/
-
-static inline double DaylightSavingTA(double t, double localTZA) // t is a UTC time
-{
- return QTimeZone::systemTimeZone().offsetFromUtc(
- QDateTime::fromMSecsSinceEpoch(qint64(t), Qt::UTC)) * 1e3 - localTZA;
-}
-#elif defined(USE_QDT_LOCAL_TIME)
static inline double DaylightSavingTA(double t, double localTZA) // t is a UTC time
{
- return QDateTime::fromMSecsSinceEpoch(qint64(t), Qt::UTC
- ).toLocalTime().offsetFromUtc() * 1e3 - localTZA;
-}
-#else
-// This implementation fails to take account of past changes in standard offset.
-static inline double DaylightSavingTA(double t, double /*localTZA*/)
-{
- struct tm tmtm;
-#if defined(Q_CC_MSVC)
- __time64_t tt = (__time64_t)(t / msPerSecond);
- // _localtime_64_s returns non-zero on failure
- if (_localtime64_s(&tmtm, &tt) != 0)
-#elif !defined(QT_NO_THREAD) && defined(_POSIX_THREAD_SAFE_FUNCTIONS)
- long int tt = (long int)(t / msPerSecond);
- if (!localtime_r((const time_t*) &tt, &tmtm))
-#else
- // Returns shared static data which may be overwritten at any time
- // (for MinGW/Windows localtime is luckily thread safe)
- long int tt = (long int)(t / msPerSecond);
- if (struct tm *tmtm_p = localtime((const time_t*) &tt))
- tmtm = *tmtm_p;
- else
-#endif
- return 0;
- return (tmtm.tm_isdst > 0) ? msPerHour : 0;
+ return QLocalTime::getUtcOffset(qint64(t)) * 1e3 - localTZA;
}
-#endif // USE_QTZ_SYSTEM_ZONE
static inline double LocalTime(double t, double localTZA)
{
@@ -735,49 +648,7 @@ static inline QString ToLocaleTimeString(double t)
static double getLocalTZA()
{
-#ifndef Q_OS_WIN
- tzset();
-#endif
-#ifdef USE_QTZ_SYSTEM_ZONE
- // TODO: QTimeZone::resetSystemTimeZone(), see QTBUG-56899 and comment above.
- // Standard offset, with no daylight-savings adjustment, in ms:
- return QTimeZone::systemTimeZone().standardTimeOffset(QDateTime::currentDateTime()) * 1e3;
-#elif defined(USE_QDT_LOCAL_TIME)
- QDate today = QDate::currentDate();
- QDateTime near = today.startOfDay(Qt::LocalTime);
- // Early out if we're in standard time anyway:
- if (!near.isDaylightTime())
- return near.offsetFromUtc() * 1000;
- int year, month;
- today.getDate(&year, &month, nullptr);
- // One of the solstices is probably in standard time:
- QDate summer(year, 6, 21), winter(year - (month < 7 ? 1 : 0), 12, 21);
- // But check the one closest to the present by preference, in case there's a
- // standard time offset change between them:
- QDateTime far = summer.startOfDay(Qt::LocalTime);
- near = winter.startOfDay(Qt::LocalTime);
- if (month > 3 && month < 10)
- near.swap(far);
- bool isDst = near.isDaylightTime();
- if (isDst && far.isDaylightTime()) // Permanent DST, probably an hour west:
- return (qMin(near.offsetFromUtc(), far.offsetFromUtc()) - 3600) * 1000;
- return (isDst ? far : near).offsetFromUtc() * 1000;
-#else
-# ifdef Q_OS_WIN
- TIME_ZONE_INFORMATION tzInfo;
- GetTimeZoneInformation(&tzInfo);
- return -tzInfo.Bias * 60.0 * 1000.0;
-# else
- struct tm t;
- time_t curr;
- time(&curr);
- localtime_r(&curr, &t); // Wrong: includes DST offset
- time_t locl = mktime(&t);
- gmtime_r(&curr, &t);
- time_t globl = mktime(&t);
- return (double(locl) - double(globl)) * 1000.0;
-# endif
-#endif // USE_QTZ_SYSTEM_ZONE
+ return QLocalTime::getCurrentStandardUtcOffset() * 1e3;
}
DEFINE_OBJECT_VTABLE(DateObject);