From 718a2251be2d32f96befef1ec23912c1a2ce3e34 Mon Sep 17 00:00:00 2001 From: Mitch Curtis Date: Thu, 16 Aug 2012 15:55:31 +0200 Subject: Serialise QDateTime as UTC and timeSpec() instead of private spec. QDateTime currently serialises its private Spec enum. If a user was to deserialise the individual components of a QDateTime separately, the resulting timeSpec may be invalid when cast to the Qt::TimeSpec enum. E.g.: QDateTime dateTime(QDate(2012, 8, 14), QTime(8, 0, 0), Qt::UTC); // ... serialise // ... deserialise date, time, spec separately. // spec == 2, the value of QDateTimePrivate::UTC. // spec != UTC, will be set to LocalUnknown. QDateTime deserialised(date, time, spec); This patch serialises QDateTime objects in UTC and the value of timeSpec() as opposed to QDateTimePrivate's spec. This changes the serialisation behaviour of QDateTime for version 13 of QDataStream. Task-number: QTBUG-4057 Change-Id: If650e7960dca7b6ab44b8233410a6369c41df73a Reviewed-by: Thiago Macieira --- src/corelib/tools/qdatetime.cpp | 33 +++++++++++++++++++++++++++------ 1 file changed, 27 insertions(+), 6 deletions(-) (limited to 'src/corelib') diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp index 293838e9a5..3324408fde 100644 --- a/src/corelib/tools/qdatetime.cpp +++ b/src/corelib/tools/qdatetime.cpp @@ -3666,9 +3666,19 @@ QDataStream &operator>>(QDataStream &in, QTime &time) */ QDataStream &operator<<(QDataStream &out, const QDateTime &dateTime) { - out << dateTime.d->date << dateTime.d->time; - if (out.version() >= 7) - out << (qint8)dateTime.d->spec; + if (out.version() >= 13) { + if (dateTime.isValid()) { + QDateTime asUTC = dateTime.toUTC(); + out << asUTC.d->date << asUTC.d->time; + } else { + out << dateTime.d->date << dateTime.d->time; + } + out << (qint8)dateTime.timeSpec(); + } else { + out << dateTime.d->date << dateTime.d->time; + if (out.version() >= 7) + out << (qint8)dateTime.d->spec; + } return out; } @@ -3684,11 +3694,22 @@ QDataStream &operator>>(QDataStream &in, QDateTime &dateTime) { dateTime.detach(); - qint8 ts = (qint8)QDateTimePrivate::LocalUnknown; in >> dateTime.d->date >> dateTime.d->time; - if (in.version() >= 7) + + if (in.version() >= 13) { + qint8 ts = 0; in >> ts; - dateTime.d->spec = (QDateTimePrivate::Spec)ts; + if (dateTime.isValid()) { + // We always store the datetime as UTC in 13 onwards. + dateTime.d->spec = QDateTimePrivate::UTC; + dateTime = dateTime.toTimeSpec(static_cast(ts)); + } + } else { + qint8 ts = (qint8)QDateTimePrivate::LocalUnknown; + if (in.version() >= 7) + in >> ts; + dateTime.d->spec = (QDateTimePrivate::Spec)ts; + } return in; } #endif // QT_NO_DATASTREAM -- cgit v1.2.3