The timeZone() function used to assert when called on such an object
(or, for a release build, return an invalid time zone).
Change-Id: I6ae8316b2ad76f1f868e2498f7ce8aa3fcabf4a6
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
QDateTime::addSecs needs to do something similar, but not identical
because it needs the number of days too. And then there are daylight
savings transitions...
Task-number: QTBUG-47717
Change-Id: I7de033f80b0e4431b7f1ffff13f976f4f5e5a059
Reviewed-by: Allan Sandfeld Jensen <allan.jensen@theqtcompany.com>
Last commit changed QDateTime::d to be a QSharedDataPointer that
implicitly detaches on non-const operator->() calls. That means we no
longer need to explicitly call detach().
More than that, we should not do it, so we avoid checking the ref count
and try to detach on every use. To do that, in functions where the d
pointer was accessed more than once, I detach at the top and shadow the
"d" variable with a local plain pointer. We don't compile our sources
with -Wshadow, so this should not be a problem.
Change-Id: Ic5d393bfd36e48a193fcffff13b969c281c36d0c
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
...a namespace-level static function. The ok parameter was never
set by any caller.
Change-Id: I668f78fe198f09fb0a9a52c10c8dea2fab070653
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Factor the TextDate and ISODate legs into separate functions
and replace a chain of QString::arg() with QStringBuilder.
Saves 76B in text size.
More importantly, restores (N)RVO for these code paths.
Change-Id: I8b99bb672f5a4b5506d53487eca189d48b4025e9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Compilers don't like out parameters.
Effects on Linux GCC 4.9 stripped release builds:
text -584B
data +-0B
relocs +-0
Change-Id: Ie00c89b9edaced3a6adeb2707734c8f5238e67c1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
The function getDateFromJulianDay() is simple arithmetic, but still
~400 bytes in executable size.
Yet GCC inlines this everywhere I looked, which makes some sense,
as different users of the class only use parts of the return
value and the optimizer has a field day removing all that dead
code.
However, that function has only one conditional, so presumably it
executes at full pipeline speed and it doesn't matter that it
calculates too much in some cases. More important is to use the
I-cache more conservatively.
That's what not inlining the function achieves.
The function returns its result in registers and doesn't spill
registers when called (at least on AMD64), so the effect on
runtime should be negligible.
Effects on Linux GCC 4.9 stripped release builds:
text -1536B
data +-0B
relocs +-0
Change-Id: Ia16838102d29ad67ee5efdc8b7b0a26f2f921df1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Instead of using a QString::arg() cascade, which creates tons of
temporaries, use good 'ol sprintf().
Effects on Linux GCC 4.9 stripped release builds:
text -308B
data +-0B
relocs +-0
Change-Id: I348577491d1399b5040f7ed9e9f6b111a9528e5d
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Save one return statement per function. I don't see why the compiler
can't fuse these itself, but apparently it cannot, since this
transformation saves 72B in text size.
Change-Id: I3a661456554bf451ed53110ad546946ff7b84ec5
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
All other similar functions in QDate just return an empty string
in case none of the switch labels would trigger (which would now
cause a compiler warning, after removing the default case label),
so do that here, too.
Saves 44B in text size.
Change-Id: I80ee4975082706adcd15fe89511d08c67e149324
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
They're pure whitespace, since in each case there is a fallback
after the switch, anyway, and their presence prevents compiler
warnings about unhandled enumeration values in switch statements,
which is nice-to-have, when adding to the enum, eventually.
No change in executable code size.
Change-Id: I77aecaeff990601f957ec9ee827eff5ead25aaa1
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Refactor the code so that the localMSecsToEpochMSecs function always
gets the daylight status as input. The calculation can be very wrong if
we forget to set it.
Change-Id: I39e2a3fa6dc7c4a417f23288f10b303e450b8b98
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@theqtcompany.com>
In QtScript we use the msecs since epoch conversion (JS date is based on
the concept). After a8c74ddcf7 the date
conversion test in qtscript started to fail. Instead of relying on the
code working by chance, simply update the date when setting it with
setMSecsSinceEpoch.
Task-number: QTBUG-44885
Change-Id: I9f95c9cdccea52e7d1f808f3cb9e18570ef0df13
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This also removes a dependency to 3rd party licensed code.
Change-Id: Ia4818a5cf306501bdb7192265edc4bcba8e597d8
Reviewed-by: Simon Hausmann <simon.hausmann@theqtcompany.com>
When timezone support for QDateTime was added, we decided it was a good
idea to delay creating the QTimeZone object and checking that the time
is valid in that timezone (including for local time) until the user
requested that information. Unfortunately, QExplicitlySharedDataPointer
returns a non-const T* in operator->(), which meant we were accidentally
modifying the d pointer's contents in const methods, which in turn means
those const methods were not thread-safe when operating on the same
object.
This commit changes the d pointer to QSharedDataPointer, which is safer
in this regard and pointed out where the issues with constness were
located. Since we can't lazily calculate QTimeZone anymore, we need to
do it whenever the date, time or offset changes.
Task-number: QTBUG-43703
Change-Id: Ic5d393bfd36e48a193fcffff13b9686ef4ef1454
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Saves a couple dozen bytes in text size on optimized AMD64 builds.
Change-Id: Iefd9ca05a7b27f240836c1e1e00df569742fcd7f
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
As requested in review of 1d2efe1f27.
I didn't add a comma in front of the timeSpec() as the other fields
aren't separated by commas, either.
Change-Id: I54d74b7199ca7e46e28d2ceca22b02205e318c90
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Instead of using a QString::arg() cascade, which creates tons of
temporaries, use good 'ol sprintf().
Effects on Linux GCC 4.9 stripped release builds:
text -216B
data +-0B
relocs +-0
Change-Id: I6ff551cb9f42e0c05a64f03a8e177fb527915481
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Instead of using a QString::arg() cascade, which creates tons of
temporaries, use good 'ol sprintf(). As a consequence, this
function is now inlined into all four callers and the total
executable size _still_ goes down:
Effects on Linux GCC 4.9 stripped release builds:
text -420B
data +-0B
relocs +-0
Change-Id: I10d6abd94b489db7c2f01dc5424f30a798602522
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Compilers *really* don't like out parameters.
(Impressive) effects on Linux GCC 4.9 stripped release builds:
text -2512B
data +-0B
relocs +-0
Change-Id: I0fe370a438f7b82aaa9cc04ddd56e45a5969e7a9
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Get the captured texts once and use indexing into the QStringList
instead of repeatedly calling QRegExp::cap(n).
(Impressive) effects on Linux GCC 4.9 stripped release builds:
text -2876B
data +-0B
relocs +-0
Change-Id: I3a02eab1a691f31c30654cd89a0c030414b40de0
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Compilers don't like out parameters.
Effects on Linux GCC 4.9 stripped release builds:
text -528B
data +-0B
relocs +-0
Change-Id: I32ee1a6c4388900bacfc6eb20feb4b81d71cb1f2
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Instead of constructing a QString that describes the QDateTime
instance, stream the constituents of the string into QDebug
directly, using op<< for Q_ENUM, now that it's available.
Adapt test to new format of enums.
Effects on Linux GCC 4.9 stripped release builds:
text -1068B
data +-0B
relocs +-0
Change-Id: I1a5ce28904edd7d0f6c8d982fd41c52e3536e036
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
It wasn't Q_DECL_EXPORT'ed, and there is no other user in QtCore.
Effects on Linux GCC 4.9 stripped release builds:
text -344B
data +-0B
relocs +-0
Change-Id: Iea0577d58057a145f87a00ec33995d03bacd4f88
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
...instead of rolling a new one on each use.
Effects on Linux GCC 4.9 stripped release builds:
text -156B
data +-0B
relocs +-0
Change-Id: I49e20ea859928d010990fc7a22545dbc1ef106ec
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Help the compiler by building the new status flags in a local
instead of a member variable. Enables value tracking for that
piece of data across several non-inline function calls, leading
to less redundant reads through this->.
Effects on Linux GCC 4.9 stripped release builds:
text -248B
data +-0B
relocs +-0
Change-Id: I2db21439464ad0fff8163a908de3b15df7c4ab6d
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@theqtcompany.com>
Apparently, determining that constant at compile time is a bit too much
work for GCC.
Effects on Linux GCC 4.9 stripped release builds:
text -276B
data +-0B
relocs +-0
Change-Id: I23144e64d57e3a2e1061e69b20f2b72575c273d8
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
The short month names all have length 3, so store them in a multi-
dimensional const char array instead of as a pointer table.
Effects on Linux GCC 4.9 stripped release builds:
text -196B
data -64B
relocs -12 (est., somehow relinfo.pl reports nonsense on QtCore)
Change-Id: If5f83e4f1eb5ba0b0f54b4144abec8b88fb8529f
Reviewed-by: Olivier Goffart (Woboq GmbH) <ogoffart@woboq.com>
Qt copyrights are now in The Qt Company, so we could update the source
code headers accordingly. In the same go we should also fix the links to
point to qt.io.
Outdated header.LGPL removed (use header.LGPL21 instead)
Old header.LGPL3 renamed to header.LGPL3-COMM to match actual licensing
combination. New header.LGPL-COMM taken in the use file which were
using old header.LGPL3 (src/plugins/platforms/android/extract.cpp)
Added new header.LGPL3 containing Commercial + LGPLv3 + GPLv2 license
combination
Change-Id: I6f49b819a8a20cc4f88b794a8f6726d975e8ffbe
Reviewed-by: Matti Paaso <matti.paaso@theqtcompany.com>
Unify the behavior of the different operator<< by always using
QDebugStateSaver (appending an optional space at exit), and making
sure that the space(), nospace() setting isn't 'leaked'.
Change-Id: I38e4f82fa6f7419d8b5edfc4dc37495af497e8ac
Reviewed-by: Alex Blasche <alexander.blasche@theqtcompany.com>
[ChangeLog][QtCore][QTimeZone] Added methods systemTimeZone() and utc()
that return QTimeZone objects for the system time zone and for UTC,
respectively.
Change-Id: Ic5d393bfd36e48a193fcffff13b96821bb8514b9
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
QDateTimePrivate::setDateTime has a comment saying this is intentional,
so document it.
Task-number: QTBUG-43704
Change-Id: Ic5d393bfd36e48a193fcffff13b965409eaf7be9
Reviewed-by: Martin Smith <martin.smith@digia.com>
MM stands for month, SS is invalid
mostly cherry picked from Qt4 commit 670f460fab6a386407c07281cf6417ccf6430970.
Task-number: QTBUG-12236
Change-Id: I7af4be655d2d10f1befa1366abb48225c60d31dc
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Added support on QDateTime::fromString to read correctly dates on ISO
format with Time zone designators at format [+-]HH
Change-Id: Ied5c3b7950aee3d0879af0e05398081395c18df5
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Mark Brand <mabrand@mabrand.nl>
The implementation was inconsistent with QString::right(),
and did not return the N rightmost characters but actually did
the same as QString::mid(N) (returning the rightmost size - N
characters.)
Since this function is fairly recent (Qt 5.2), is documented to
behave the same as QString::right(), and since these APIs are
meant to be interchangeable, this needs to be fixed, even though
it changes behavior.
[ChangeLog][Important Behavior Changes] Changed QStringRef::right()
to be consistent with QString::right(). The function now returns
the N right-most characters, like the documentation already claimed.
Change-Id: I2d1cd6d958dfa9354aa09f16bd27b1ed209c2d11
Task-number: QTBUG-41858
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Jędrzej Nowacki <jedrzej.nowacki@digia.com>
For QLatin1String, operator== is overloaded, so comparing to a latin-1
(C) string literal is efficient, since strlen() is comparatively fast.
OTOH, QStringLiteral, when not using RVO, litters the code with
QString dtor calls, which are not inline. Worse, absent lambdas,
it even allocates memory.
So, just compare using QLatin1String instead.
Change-Id: I7af3bf3a67c55dae33ffaf9922d004fa168a3f9c
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
This data is clearly not (and will never be) utf8 data, so using fromLatin1
avoids the (slightly more expensive) utf8 mangling.
I didn't see any significant impact on benchmarks, but I also wasn't
specifically collecting data when making this change.
Change-Id: I45190d40b2caccf15b1f9a1ae5b7dcd08cbd541f
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
By using QStringRef instead of QString, we avoid a data copy. This takes the
QDateTime::fromStringIso benchmark from 0.79ms to 0.53ms for me.
Change-Id: Ibb36067491ffc275ce3b667cb0e04941aa9457f0
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Replacing usage QString::split by QString::splitRef saves a few
allocations.
Change-Id: I1cadca296279248b75af6f9f8394c54f13c37c55
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
It is a minor reduction, in release build it is ~200 bytes
Change-Id: I4f7972c95769f2e0ca1ddc935ff7a0a6b4379e2a
Reviewed-by: Marc Mutz <marc.mutz@kdab.com>
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
We really do not need to do string parsing there.
Change-Id: Ie2277d9ff0d0445285b7108023941af111d9baca
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Without it, one might run the risk of QDateTime::currentDateTime()
returning an invalid QDateTime the first time after changing timezone.
Change-Id: I3efb04d41e7fe4685f6cc5fb41b68424eb4b9eb8
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Previously, this produced wrong results, for example -3:30
became -3:-30.
Change-Id: I10efdfb48e5542b917c86b29cf8a99bfc26f7fe0
Reviewed-by: John Layt <jlayt@kde.org>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Follow-up to 91d3298: qt_timezone() expects the number of seconds west
of UTC, whereas tm_gmtoff returns the number of seconds east of UTC, and
contrary to the timezone variable it is not oblivious to DST.
We have to account for those two facts and make sure we return a value
compatible with what timezone would have.
Change-Id: Iacb9077f50d4c847ac09e5a7e952d0e4cd22da1b
Reviewed-by: Gabriel de Dietrich <gabriel.dedietrich@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
timezone is defined differently in FreeBSD compared to other
(more or less) POSIX-compliant Unices.
Task-number: QTBUG-36080
Change-Id: I4ad1a5ccd0b9ddbadb9fdd90edc26cf0c7252dfb
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Adding std:: to pow() to make it compile for BlackBerry 10.
Change-Id: I9ab3cc626eb2ba872c09df33cdb820b50d075428
Reviewed-by: Wolfgang Bremer <wbremer@blackberry.com>
Reviewed-by: Fabian Bumberger <fbumberger@rim.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
The patch reduces amount of allocations during
string parsing by using QStringRef. The operation
is safe as neither QDate nor QTime uses QString as
a storage type
Change-Id: Ib9f40d86e8e420653ac4fe8ba883d554331ffc32
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Fix parsing of ISO Date from being totally lenient to being semi-strict
by requiring the separator positions to be non-numeric.
[ChangeLog][Important Behavior Changes] Parsing of Qt::ISODate by
QDate::fromString() and QDateTime()::fromString() is not as lenient as
before, the date component separators are now required to be
non-numeric. This means a string like "2000901901" will no longer be
recognized as a valid ISO Date, but "2000/01/01" will still be even
though it doesn't strictly meet the ISO format of "2000-01-01".
Task-number: QTBUG-34141
Change-Id: I0e481144136c60d4cac61364b9b2c1d2cd1e78fc
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Explicitly check that the QTimeZone is valid before trying to use it.
Change-Id: Iec415a2cb07071502fe71ee5ac92a7657e818f99
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
For the conflicts in msvc_nmake.cpp the ifdefs are extended since we
need to support windows phone in the target branch while it is not there
in the current stable branch (as of Qt 5.2).
Conflicts:
configure
qmake/generators/win32/msvc_nmake.cpp
src/3rdparty/angle/src/libEGL/Surface.cpp
src/angle/src/common/common.pri
src/corelib/global/qglobal.h
src/corelib/io/qstandardpaths.cpp
src/plugins/platforms/qnx/qqnxintegration.cpp
src/plugins/platforms/qnx/qqnxscreeneventhandler.h
src/plugins/platforms/xcb/qglxintegration.h
src/widgets/kernel/win.pri
tests/auto/corelib/thread/qreadwritelock/tst_qreadwritelock.cpp
tests/auto/corelib/tools/qdatetime/tst_qdatetime.cpp
tests/auto/gui/text/qtextdocument/tst_qtextdocument.cpp
tools/configure/configureapp.cpp
Change-Id: I00b579eefebaf61d26ab9b00046d2b5bd5958812
A small optimization to the private refreshDateTime() function, improves
standard performance tests by 0.3 msecs per iteration for affected
functions, e.g. isValid() and offsetFromUtc() improve from 5.4 to 5.1.
Change-Id: Ie67812649ef244388b484af35848b09d92dee38a
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Optimize the performance of date() and time(), resulting in a one-third
improvement, and subsequent improvements in all date/time based
functions. Tested over 1000 iterations of the standard benchmarks, in
msecs per iteration:
Before After
date()/time() 0.3 0.2
setDate()/setTime() 0.9 0.8
daysTo() 0.6 0.4
Note original performance before msecs storage was 0.06.
Change-Id: Ie838e560ddf7129281531dc965af56ac19cce91d
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
The RFC 2822 date format should always use en_US locale for month and
day names instead of whatever the system locale is. Also remove some
duplicate code.
Change-Id: Ia2f7ee405b4e0e2f04980301783b9488628da73f
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Check if the datetime is valid before converting it to a different time
spec. If it is invalid then just change the spec to keep behavior
consistent with 5.1.
Task-number: QTBUG-34020
Change-Id: I6630ec1d50f810a2178ab3222bd32af018085f81
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Default values should have mark-up to denote that they are code.
This commit changes:
-"property is true" to "property is \c true".
-"Returns true" to "Returns \c true".
-"property is false" to "property is \c false".
-"returns true" to "returns \c true".
-"returns false" to "returns \c false".
src/3rdparty and non-documentation instances were ignored.
Task-number: QTBUG-33360
Change-Id: Ie87eaa57af947caa1230602b61c5c46292a4cf4e
Reviewed-by: Oswald Buddenhagen <oswald.buddenhagen@digia.com>
Reviewed-by: Jerome Pasion <jerome.pasion@digia.com>
Provides locale-related codepaths for WinRT where existing Win32 API is
unsupported.
Change-Id: I35b83d6b208165b7660cac3c9b383cb6ba7e5cf9
Done-with: Maurice Kalinowski
Reviewed-by: Andrew Knight <andrew.knight@digia.com>
Reviewed-by: Friedemann Kleint <Friedemann.Kleint@digia.com>
At the Daylight Tme to Standard Time transition, the local time repeats
itself, i.e. 2am occurs twice. Qt's behavior when setting this using
the local time is ambiguous, as it depends on the system implementation
of mktime, which behaves differently on different platforms. Currently
this behavior remains undefined. When setting using an msecs or time_t
value however we can determine the correct instance to use and cache it
to ensure that any conversion back from local time to msecs is performed
consistantly on all platforms.
Note that caching this value will result in any calculations being wrong
should the system time zone change, or its rules change. This will be
fixed in Qt 5.3 when the system time zone change signal is implemented
and QDateTime switches to using QTimeZone instead of mktime to provide
consistnt behavior across platforms.
The QTimeZone spec does not require this fix as it already caches the
correct offset in setMSecsFromEpoch().
Change-Id: I799588db474e744a6d81e80f6a0442920569ebd3
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Found by ICC.
Change-Id: Icd89e7df828afdb2acf2c46e00698ef04d5d94c9
Reviewed-by: Konstantin Ritt <ritt.ks@gmail.com>
Reviewed-by: John Layt <jlayt@kde.org>
Add support to QDateTime for time zones using the new QTimeZone class.
[ChangeLog][QtCore][QDateTime] Add support for a new Qt::TimeZone
spec to be used with QTimeZone to define times in a specific
time zone.
Change-Id: I21bfa52a8ba8989b55bb74e025d1f2b2b623b2a7
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Move some of the static helper and private functions to better
organize the code. No code actually changed.
Change-Id: I6d5dd6bcb9fc5af56d2dbe9e53bc9f0a000c4fa4
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Add new method to return if the current time is Daylight Time.
[ChangeLog][QtCore][QDateTime] Added new method isDaylightTime() to
return if the datetime is in Daylight Time or not.
Change-Id: Icb93fd5dd0b2f7d83d2d4643eeb12922c1137e3e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Change the datetime serialisation from using QDateTimePrivate::Spec to
using Qt::TimeSpec. Only public classes and enums are now used to
serialise, making the format safer..
Clean up the code to make each version clearer, this duplicates some
code but is easier to read and support.
Change-Id: I3d8fc05f50f8e8acb9edbb992e5ce06063654b8e
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
When Daylight Time transtion goes from Standard Time to Daylight Time
there is a "missing" hour, i.e. at 2am CET the clock goes forward to
3am. Currently QDateTime ignores this gap and considers the time to be
valid and able to be manipulated. This change respects the transition,
so any time set in the missing hour is considered invalid, and any date
maths returns valid results.
The validity in the current time zone needs to be checked every time
isValid() is called in case the system time zone has changed since the
last time it was checked. This is done by calling mktime to check the
returned result matches the expected result. This could be very
inefficient, but the returned offset value is cached each time so
mktime is not required to be called again within each method call,
effectively meaning mktime is called the same number of times by
each method. Note that this means any new methods added must be
careful to ensure either isValid() or refreshLocalTime() is called
first by any method needing to use the UTC value.
[ChangeLog][QtCore][QDateTime] The Standard Time to Daylight Time
transition for Qt::LocalTime is now handled correctly. Any date set
in the "missing" hour is now considered invalid. All date math results
that fall into the missing hour will be automatically adjusted to a
valid time in the following hour.
Change-Id: Ia652c8511b45df15f4917acf12403ec01a7f08e7
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Change from storing the date and time as QDate and QTime to a serialised
msecs format. This format is a direct translation of the QDate and
QTime values, it is not the actual msecs since the Unix epoch. This
msecs format ensures we are always able to recreate the original QDate
and QTime values, but should still simplify the code and improve
performance.
Because we no longer store the explicit date and time we need to store
their isNull()/isValid() status separately.
The changes in storage results in the same memory footprint as before.
Note that this change does not optimize the code nor set out to fix the
known bugs, it only seeks to maintain the current behavior, although
some bugs are fixed implicitly. More bug fixes and optimizations will
follow.
[ChangeLog][Important Behavior Changes] The supported date range in
QDateTime has been reduced to about +/- 292 million years, the range
supported by the number of msecs since the Unix epoch of 1 Jan 1970
as stored in a qint64, and as able to be used in the
setMSecsSinceEpoch() and toMSecsSinceEpoch() methods.
Change-Id: I98804d8781909555d3313a3a7080eb8e70cb46ad
Reviewed-by: Sérgio Martins <sergio.martins@kdab.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Change storing the spec from QDateTimePrivate::Spec to Qt::TimeSpec.
Remove the storage and use of the Daylight Status as it is almost
never set or used, and would be inaccurate if the tz were to change.
It will be replaced later with proper daylight transition support.
This simplifies the code and makes the msecs storage change easier.
Change-Id: I78a70905025d7eddf1c2dc6001f6b490e5a2b3b8
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
A number of QDateTime functions directly use or modify the data stored
in the private, but future changes to store msecs and status make this
maintenance more complicated. Where possible simplify this code to use
the standard msecs functions, standard constructors, or public api
instead. This greatly simplifies the functions and the following msecs
storage code changes.
This is an intermim step towards storing the time in msecs. Some
functions will be slower as a result of this change, optimization
will take place after all the msecs changes are completed.
Note this also removes a test that used valid QDates outside the range
of msecs, this change in behavior will be documented in the final
mscs change.
Change-Id: I6ef710f24babc7024091010064082e9be0b5bbfe
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Add new public api to get and set the number of msecs since the start
of the day. Modify QDateTime to use the new msecs api.
[ChangeLog][QtCore][QTime] Added new methods fromMSecsSinceStartOfDay()
to create a new QTime from an msecs value, and msecsSinceStartOfDay()
to return the QTime as the number of msecs since the start of the day.
Change-Id: I285b725b883f1f5524fda87ca81bd64ed99fe6f4
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Not strictly needed yet, but helps to reduce the size of QDateTime and
make it easier to read a major re-write. Imposes separation of parser
which will be needed if we make QLocale always use the system backends,
after which only QDateTimeEdit widget will need the parser and it can
be moved there.
Change-Id: I6a5e9a3edf6fe8ff2340af6afecd8ba4bfde9dd4
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Change the debug format from Qt::TextDate to a more detailed ISO style
format including better time spec output.
[ChangeLog][QtCore][QDateTime] The debug datastream is now an ISO-like
format instead of Qt::TextDate
Change-Id: Iddbb8199c3bfbf7bca845482617e7a85da43259d
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Clarify the documentation with regard to what locale is used for names,
fix missing hour, timezone and am/pm format code details.
Change-Id: Ic2d507a89a005427bba0df6368364b47bcf58756
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Clean-up the implementation of toString() and fromString() methods in
QDate, QTime and QDateTime code to be more consistent in ISODate and
TextDate behavior, especially when handling TimeSpec.
Reformat some code so all methods are consistent in appearance and
function to make maintenance easier.
This changes some corner-case behavior in TextDate and ISODate, but
this either fixes bugs or makes the behavior match the documentation.
Change-Id: I457aa1d7cd4f448cd9f8a2e80ec635f3cb98e58c
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
The limit on formatting a year outside the range 0 to 9999 only applies
to Qt::ISODate formatting, not to general date formatting.
Change-Id: Ifc971961412c190d721f23627982283e13d526b6
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Switch the implementation of toString() methods in QDate, QTime and
QDateTime to use the QLocale formatter, and remove the now redundant
QDateTime formatter.
Change-Id: Ie4f17c8a6e31acde3ce066f19835bb2b83351ce8
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Add a new method to return the time zone abbreviation for the current
time spec. For LocalTime this is the abbreviation returned by mktime.
This new method will later be used in changes to the date formatter
and QTimeZone.
Note this change does not implement WinCE support.
[ChangeLog][QtCore][QDateTime] Add method timeZoneAbbreviation() to
return effective time zone abbreviation.
Change-Id: I265a5e96c72eb7236974f80f053f1fb341e3c816
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Add convenience methods for fromMSecsSinceEpoch() and
fromTime_t() to enable direct creation of other time specs
than LocalTime without the overhead of unncessary conversions.
For example instead of:
QDateTime dt = fromMSecsSinceEpoch(12345).toUtc();
the following saves two conversions:
QDateTime dt = fromMSecsSinceEpoch(12345, Qt:UTC);
This will improve the performance of the new QTimeZone class.
[ChangeLog][QtCore][QDateTime] Added convenience methods for
fromMSecsSinceEpoch() and fromTime_t() to take time spec to be used in
returned datetime.
Change-Id: I133635bfe3d35ee496a287257e13b2d600225a38
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
The Qt::OffsetFromUtc TimeSpec was made public in Qt 4.4 but the access
methods were never made public in the apidox effectively meaning the
feature was never used. The implementation was also incomplete and
inconsistent.
This change cleans up the implementation and exports new public API for
using the TimeSpec using new method names consistent with the new
QTimeZone support.
This change increases the QDataStream Version number for Qt 5.2 to 15.
The behavior of one constructor has changed slightly to be consistent
with the rest of the feature, but this behavior was never documented.
[ChangeLog][QtCore][QDateTime] Fully implement support for Qt::TimeSpec
of Qt::OffsetFromUTC, added new methods for offsetFromUTC(),
toTimeSpec(), and toOffsetFromUTC().
Task-number: QTBUG-26161
Task-number: QTBUG-29666
Change-Id: If3cc7fc9778ca2b831644408ae749448d5975a3a
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Currently the QDateTime::addDays/Months/Years methods copy all the
d member variables themselves, but this is bad practice as it means 3
more places where we have to get the copy code correct. Instead use
the copy constructor to do what it's meant to. This saves more changes
when we add proper OffsetFromUTC and TimeZone support.
Change-Id: Ie2641d0cb58405335206edcce2e2db30702b78bf
Reviewed-by: Mitch Curtis <mitch.curtis@digia.com>
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
QDateTime can now be converted to strings compliant to RFC 2822.
Additionally, it supports RFC 850 and RFC 1036 during parsing.
By having them all together, all type of dates found in exchanged
messages on the internet (including USENET) get supported.
Change-Id: I771066c23f409d20b31b7d802f37852ea68ca2a0
Reviewed-by: David Faure <david.faure@kdab.com>
Reviewed-by: Frederik Gladhorn <frederik.gladhorn@digia.com>
QDateTime.toString() is writing out milliseconds since change
15da0a5af2. Unfortunately this breaks
QDateTime::fromString() with Qt::TextDate which can't handle the new
format.
Fix by making QDateTime::fromString split up seconds and milliseconds
on a period, if any. Now
QDateTime dt = ...;
assert(QDateTime::fromString(dt.toString(), Qt::TextDate) == dt)
works again.
Change-Id: Ibfe9032e357ceaf894e33f3e33affe94f56dbf5c
Reviewed-by: Lars Knoll <lars.knoll@digia.com>
Section 4.2.2.4 of ISO 8601 allows for decimal fraction representations
of dates and times. Currently, when calling
QDateTime::toString(Qt::TextDate) or QDateTime::toString(Qt::ISODate),
the milliseconds will be omitted. However,
QDateTime::fromString(str, Qt::TextDate) and
QDateTime::fromString(str, Qt::ISODate) already support decimal
fraction representations, so this patch just adds this support to
QTime::toString, and hence QDateTime::toString().
Task-number: QTBUG-30250
Change-Id: If58e4b3d3105322c51d11a76b832e5e634d8991f
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>
In Qt 5, I managed to break the guarantee that a deserialised local
datetime is the same time of day (potentially different UTC time),
regardless of which timezone it was serialised in. This happened after
I fixed QTBUG-4057 with If650e7960dca7b6ab44b8233410a6369c41df73a,
which serialised datetimes as UTC.
This patch reverts QDateTime serialisation to pre-Qt 5 behaviour to
restore the guarantee and consequently re-opens QTBUG-4057.
Change-Id: Iea877f7ed886f530b928067789b53534e89fe8cb
Reviewed-by: Thiago Macieira <thiago.macieira@intel.com>