Implement in QLocalTime the offset functions V4 Date needs
Prepare to replace a large pile of #if-ery-laden tangled mess from the implementation of V4 Date by implementing a cleaned-up version of one of its offset calculations and using a recently refactored API of QDTP to implement the other. Task-number: QTBUG-95993 Change-Id: I469f67fb384543abeece9ce8b14bb294c8613033 Reviewed-by: Qt CI Bot <qt_ci_bot@qt-project.org> Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This commit is contained in:
parent
54d81d1189
commit
1ae4ffefbb
@ -232,6 +232,52 @@ int QDateTimeParser::startsWithLocalTimeZone(QStringView name)
|
||||
|
||||
namespace QLocalTime {
|
||||
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
// Even if local time is currently in DST, this returns the standard time offset
|
||||
// (in seconds) nominally in effect at present:
|
||||
int getCurrentStandardUtcOffset()
|
||||
{
|
||||
#ifdef Q_OS_WIN
|
||||
TIME_ZONE_INFORMATION tzInfo;
|
||||
GetTimeZoneInformation(&tzInfo);
|
||||
return -tzInfo.Bias * 60;
|
||||
#else
|
||||
qTzSet();
|
||||
const time_t curr = time(nullptr);
|
||||
/* Set t to the UTC represntation of curr; the time whose local standard
|
||||
time representation coincides with that differs from curr by local time's
|
||||
standard offset. Note that gmtime() leaves the tm_isdst flag set to 0,
|
||||
so mktime() will, even if local time is currently using DST, return the
|
||||
time since epoch at which local standard time would have the same
|
||||
representation as UTC's representation of curr. The fact that mktime()
|
||||
also flips tm_isdst and updates the time fields to the DST-equivalent
|
||||
time needn't concern us here; all that matters is that it returns the
|
||||
time after epoch at which standard time's representation would have
|
||||
matched UTC's, had it been in effect.
|
||||
*/
|
||||
# if defined(_POSIX_THREAD_SAFE_FUNCTIONS)
|
||||
struct tm t;
|
||||
if (gmtime_r(&curr, &t))
|
||||
return curr - qMkTime(&t);
|
||||
# else
|
||||
if (struct tm *tp = gmtime(&curr)) {
|
||||
struct tm t = *tp; // Copy it quick, hopefully before it can get stomped
|
||||
return curr - qMkTime(&t);
|
||||
}
|
||||
# endif
|
||||
// We can't tell, presume UTC.
|
||||
return 0;
|
||||
#endif // Platform choice
|
||||
}
|
||||
|
||||
// This is local time's offset (in seconds), at the specified time, including
|
||||
// any DST part.
|
||||
int getUtcOffset(qint64 atMSecsSinceEpoch)
|
||||
{
|
||||
return QDateTimePrivate::expressUtcAsLocal(atMSecsSinceEpoch).offset;
|
||||
}
|
||||
#endif // QT_BOOTSTRAPPED
|
||||
|
||||
// Calls the platform variant of localtime() for the given utcMillis, and
|
||||
// returns the local milliseconds, offset from UTC and DST status.
|
||||
QDateTimePrivate::ZoneState utcToLocal(qint64 utcMillis)
|
||||
|
@ -22,6 +22,16 @@ QT_BEGIN_NAMESPACE
|
||||
|
||||
// Packaging system time_t functions
|
||||
namespace QLocalTime {
|
||||
#ifndef QT_BOOTSTRAPPED
|
||||
// Support for V4's Date implelenentation.
|
||||
// Each returns offset from UTC in seconds (or 0 if unknown).
|
||||
// V4 shall need to multiply by 1000.
|
||||
// Offset is -ve East of Greenwich, +ve west of Greenwich.
|
||||
// Add it to UTC seconds since epoch to get local seconds since nominal local epoch.
|
||||
Q_CORE_EXPORT int getCurrentStandardUtcOffset();
|
||||
Q_CORE_EXPORT int getUtcOffset(qint64 atMSecsSinceEpoch);
|
||||
#endif // QT_BOOTSTRAPPED
|
||||
|
||||
// Support for QDateTime
|
||||
QDateTimePrivate::ZoneState utcToLocal(qint64 utcMillis);
|
||||
QString localTimeAbbbreviationAt(qint64 local, QDateTimePrivate::DaylightStatus dst);
|
||||
|
Loading…
x
Reference in New Issue
Block a user