summaryrefslogtreecommitdiffstats
path: root/src/corelib/tools
diff options
context:
space:
mode:
authorWarwick Allison <warwick.allison@nokia.com>2010-03-31 23:44:10 (GMT)
committerWarwick Allison <warwick.allison@nokia.com>2010-03-31 23:44:10 (GMT)
commit5c32e4129e331a95187b65c2ab16074d21d8d96f (patch)
treeb86b6297b83f95860c7402b879e9b4691f485070 /src/corelib/tools
parent1bb04f8c0675449a851cf636680951bd0a142507 (diff)
parent5fd91a33ddfb9d8419eb7b3592087e9b5d15df58 (diff)
downloadQt-5c32e4129e331a95187b65c2ab16074d21d8d96f.zip
Qt-5c32e4129e331a95187b65c2ab16074d21d8d96f.tar.gz
Qt-5c32e4129e331a95187b65c2ab16074d21d8d96f.tar.bz2
Merge branch '4.7' of scm.dev.nokia.troll.no:qt/qt-qml into 4.7
Diffstat (limited to 'src/corelib/tools')
-rw-r--r--src/corelib/tools/qdatetime.cpp127
-rw-r--r--src/corelib/tools/qdatetime.h5
-rw-r--r--src/corelib/tools/qelapsedtimer_generic.cpp4
-rw-r--r--src/corelib/tools/qelapsedtimer_unix.cpp8
4 files changed, 117 insertions, 27 deletions
diff --git a/src/corelib/tools/qdatetime.cpp b/src/corelib/tools/qdatetime.cpp
index 54a4205..dc1666a 100644
--- a/src/corelib/tools/qdatetime.cpp
+++ b/src/corelib/tools/qdatetime.cpp
@@ -2315,17 +2315,35 @@ void QDateTime::setTimeSpec(Qt::TimeSpec spec)
}
}
-static uint toTime_tHelper(const QDate &utcDate, const QTime &utcTime)
+qint64 toMSecsSinceEpoch_helper(qint64 jd, int msecs)
{
- int days = QDate(1970, 1, 1).daysTo(utcDate);
- int secs = QTime().secsTo(utcTime);
- if (days < 0 || (days == 0 && secs < 0))
- return uint(-1);
+ int days = jd - julianDayFromGregorianDate(1970, 1, 1);
+ qint64 retval = (qlonglong(days) * MSECS_PER_DAY) + msecs;
+ return retval;
+}
- qlonglong retval = (qlonglong(days) * SECS_PER_DAY) + secs;
- if (retval >= Q_INT64_C(0xFFFFFFFF))
- return uint(-1);
- return uint(retval);
+/*!
+ \since 4.7
+
+ Returns the datetime as the number of milliseconds that have passed
+ since 1970-01-01T00:00:00.000, Coordinated Universal Time (Qt::UTC).
+
+ On systems that do not support time zones, this function will
+ behave as if local time were Qt::UTC.
+
+ The behavior for this function is undefined if the datetime stored in
+ this object is not valid. However, for all valid dates, this function
+ returns a unique value.
+
+ \sa toTime_t(), setMSecsSinceEpoch()
+*/
+qint64 QDateTime::toMSecsSinceEpoch() const
+{
+ QDate utcDate;
+ QTime utcTime;
+ d->getUTC(utcDate, utcTime);
+
+ return toMSecsSinceEpoch_helper(utcDate.jd, utcTime.ds());
}
/*!
@@ -2335,16 +2353,63 @@ static uint toTime_tHelper(const QDate &utcDate, const QTime &utcTime)
On systems that do not support time zones, this function will
behave as if local time were Qt::UTC.
- \sa setTime_t()
+ \note This function returns a 32-bit unsigned integer, so it does not
+ support dates before 1970, but it does support dates after
+ 2038-01-19T03:14:06, which may not be valid time_t values. Be careful
+ when passing those time_t values to system functions, which could
+ interpret them as negative dates.
+
+ If the date is outside the range 1970-01-01T00:00:00 to
+ 2106-02-07T06:28:14, this function returns -1 cast to an unsigned integer
+ (i.e., 0xFFFFFFFF).
+
+ To get an extended range, use toMSecsSinceEpoch().
+
+ \sa toMSecsSinceEpoch(), setTime_t()
*/
uint QDateTime::toTime_t() const
{
- QDate utcDate;
- QTime utcTime;
- d->getUTC(utcDate, utcTime);
+ qint64 retval = toMSecsSinceEpoch() / 1000;
+ if (quint64(retval) >= Q_UINT64_C(0xFFFFFFFF))
+ return uint(-1);
+ return uint(retval);
+}
+
+/*!
+ \since 4.7
- return toTime_tHelper(utcDate, utcTime);
+ Sets the date and time given the number of \a mulliseconds that have
+ passed since 1970-01-01T00:00:00.000, Coordinated Universal Time
+ (Qt::UTC). On systems that do not support time zones this function
+ will behave as if local time were Qt::UTC.
+
+ Note that there are possible values for \a msecs that lie outside the
+ valid range of QDateTime, both negative and positive. The behavior of
+ this function is undefined for those values.
+
+ \sa toMSecsSinceEpoch(), setTime_t()
+*/
+void QDateTime::setMSecsSinceEpoch(qint64 msecs)
+{
+ detach();
+
+ QDateTimePrivate::Spec oldSpec = d->spec;
+
+ int ddays = msecs / MSECS_PER_DAY;
+ msecs %= MSECS_PER_DAY;
+ if (msecs < 0) {
+ // negative
+ --ddays;
+ msecs += MSECS_PER_DAY;
+ }
+
+ d->date = QDate(1970, 1, 1).addDays(ddays);
+ d->time = QTime().addMSecs(msecs);
+ d->spec = QDateTimePrivate::UTC;
+
+ if (oldSpec != QDateTimePrivate::UTC)
+ d->spec = d->getLocal(d->date, d->time);
}
/*!
@@ -2813,7 +2878,7 @@ bool QDateTime::operator<(const QDateTime &other) const
*/
/*!
- \fn qint64 QDateTime::currentMsecsSinceEpoch()
+ \fn qint64 QDateTime::currentMSecsSinceEpoch()
\since 4.7
Returns the number of milliseconds since 1970-01-01T00:00:00 Universal
@@ -2876,7 +2941,7 @@ QDateTime QDateTime::currentDateTimeUtc()
return QDateTime(d, t, Qt::UTC);
}
-qint64 QDateTime::currentMsecsSinceEpoch()
+qint64 QDateTime::currentMSecsSinceEpoch()
{
QDate d;
QTime t;
@@ -2940,7 +3005,7 @@ QDateTime QDateTime::currentDateTimeUtc()
return QDateTime(d, ct, Qt::UTC);
}
-qint64 QDateTime::currentMsecsSinceEpoch()
+qint64 QDateTime::currentMSecsSinceEpoch()
{
QDate d;
QTime ct;
@@ -3057,7 +3122,7 @@ QDateTime QDateTime::currentDateTimeUtc()
return dt;
}
-qint64 QDateTime::currentMsecsSinceEpoch()
+qint64 QDateTime::currentMSecsSinceEpoch()
{
// posix compliant system
// we have milliseconds
@@ -3088,6 +3153,27 @@ QDateTime QDateTime::fromTime_t(uint seconds)
}
/*!
+ \since 4.7
+
+ Returns a datetime whose date and time are the number of milliseconds \a msec
+ that have passed since 1970-01-01T00:00:00.000, Coordinated Universal
+ Time (Qt::UTC). On systems that do not support time zones, the time
+ will be set as if local time were Qt::UTC.
+
+ Note that there are possible values for \a msecs that lie outside the valid
+ range of QDateTime, both negative and positive. The behavior of this
+ function is undefined for those values.
+
+ \sa toTime_t(), setTime_t()
+*/
+QDateTime QDateTime::fromMSecsSinceEpoch(qint64 msecs)
+{
+ QDateTime d;
+ d.setMSecsSinceEpoch(msecs);
+ return d;
+}
+
+/*!
\since 4.4
\internal
@@ -3841,7 +3927,8 @@ static QDateTimePrivate::Spec utcToLocal(QDate &date, QTime &time)
{
QDate fakeDate = adjustDate(date);
- time_t secsSince1Jan1970UTC = toTime_tHelper(fakeDate, time);
+ // won't overflow because of fakeDate
+ time_t secsSince1Jan1970UTC = toMSecsSinceEpoch_helper(fakeDate.toJulianDay(), QTime().msecsTo(time)) / 1000;
tm *brokenDown = 0;
#if defined(Q_OS_WINCE)
@@ -3926,7 +4013,7 @@ static void localToUtc(QDate &date, QTime &time, int isdst)
localTM.tm_year = fakeDate.year() - 1900;
localTM.tm_isdst = (int)isdst;
#if defined(Q_OS_WINCE) || defined(Q_OS_SYMBIAN)
- time_t secsSince1Jan1970UTC = toTime_tHelper(fakeDate, time);
+ time_t secsSince1Jan1970UTC = toMSecsSinceEpoch_helper(fakeDate.toJulianDay(), QTime().msecsTo(time));
#else
#if defined(Q_OS_WIN)
_tzset();
diff --git a/src/corelib/tools/qdatetime.h b/src/corelib/tools/qdatetime.h
index ef5968e..f445f1c 100644
--- a/src/corelib/tools/qdatetime.h
+++ b/src/corelib/tools/qdatetime.h
@@ -230,10 +230,12 @@ public:
QDate date() const;
QTime time() const;
Qt::TimeSpec timeSpec() const;
+ qint64 toMSecsSinceEpoch() const;
uint toTime_t() const;
void setDate(const QDate &date);
void setTime(const QTime &time);
void setTimeSpec(Qt::TimeSpec spec);
+ void setMSecsSinceEpoch(qint64 msecs);
void setTime_t(uint secsSince1Jan1970UTC);
#ifndef QT_NO_DATESTRING
QString toString(Qt::DateFormat f = Qt::TextDate) const;
@@ -267,7 +269,8 @@ public:
static QDateTime fromString(const QString &s, const QString &format);
#endif
static QDateTime fromTime_t(uint secsSince1Jan1970UTC);
- static qint64 currentMsecsSinceEpoch();
+ static QDateTime fromMSecsSinceEpoch(qint64 msecs);
+ static qint64 currentMSecsSinceEpoch();
#ifdef QT3_SUPPORT
inline QT3_SUPPORT void setTime_t(uint secsSince1Jan1970UTC, Qt::TimeSpec spec) {
diff --git a/src/corelib/tools/qelapsedtimer_generic.cpp b/src/corelib/tools/qelapsedtimer_generic.cpp
index 9b589c1..85986e6 100644
--- a/src/corelib/tools/qelapsedtimer_generic.cpp
+++ b/src/corelib/tools/qelapsedtimer_generic.cpp
@@ -98,7 +98,7 @@ void QElapsedTimer::start()
qint64 QElapsedTimer::restart()
{
qint64 old = t1;
- t1 = QDateTime::currentMsecsSinceEpoch();
+ t1 = QDateTime::currentMSecsSinceEpoch();
t2 = 0;
return t1 - old;
}
@@ -112,7 +112,7 @@ qint64 QElapsedTimer::restart()
*/
qint64 QElapsedTimer::elapsed() const
{
- return QDateTime::currentMsecsSinceEpoch() - t1;
+ return QDateTime::currentMSecsSinceEpoch() - t1;
}
/*!
diff --git a/src/corelib/tools/qelapsedtimer_unix.cpp b/src/corelib/tools/qelapsedtimer_unix.cpp
index 85d7fa8..2c4ea58 100644
--- a/src/corelib/tools/qelapsedtimer_unix.cpp
+++ b/src/corelib/tools/qelapsedtimer_unix.cpp
@@ -74,7 +74,7 @@ bool QElapsedTimer::isMonotonic()
static int returnValue = 0;
if (returnValue == 0) {
-# if (_POSIX_MONOTONIC_CLOCK-0 < 0)
+# if (_POSIX_MONOTONIC_CLOCK-0 < 0) || !defined(_SC_MONOTONIC_CLOCK)
returnValue = -1;
# elif (_POSIX_MONOTONIC_CLOCK == 0)
// detect if the system support monotonic timers
@@ -97,19 +97,19 @@ static inline QPair<long, long> do_gettime()
#if (_POSIX_MONOTONIC_CLOCK-0 > 0)
timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
- return qMakePair(ts.tv_sec, ts.tv_nsec);
+ return qMakePair<long,long>(ts.tv_sec, ts.tv_nsec);
#else
# if !defined(QT_NO_CLOCK_MONOTONIC) && !defined(QT_BOOTSTRAPPED)
if (QElapsedTimer::isMonotonic()) {
timespec ts;
clock_gettime(CLOCK_MONOTONIC, &ts);
- return qMakePair(ts.tv_sec, ts.tv_nsec);
+ return qMakePair<long,long>(ts.tv_sec, ts.tv_nsec);
}
# endif
// use gettimeofday
timeval tv;
::gettimeofday(&tv, 0);
- return qMakePair(tv.tv_sec, tv.tv_usec);
+ return qMakePair<long,long>(tv.tv_sec, tv.tv_usec);
#endif
}