Convert a QDateTime in UTC to local system time

I construct a QDateTime from a string like this:

QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ");

I know that date is in UTC because that is the way it's stored. But when I want to display this date to the user, it should be in the user's local time zone. date.toLocalTime() looks promising, but it returns the exact same date!

How do I convert date to the system's local time to display to the user?

Here are some more failures:

#include <QtCore/QCoreApplication>
#include <QtCore/QDateTime>
#include <QtCore/QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ");
    QDateTime local = date.toLocalTime();

    qDebug() << "utc: " << date;
    qDebug() << "local: " << local.toString();
    qDebug() << "hax: " << local.toString(Qt::SystemLocaleLongDate);

    return a.exec();
}

Output:

utc:  QDateTime("Mon Oct 25 10:28:58 2010")
local:  "Mon Oct 25 10:28:58 2010"
hax:  "Monday, October 25, 2010 10:28:58 AM"

Answers


QDateTime knows whether it is UTC or local time. For example:

QDateTime utc = QDateTime::currentDateTimeUtc();
QDateTime local = QDateTime::currentDateTime();

local.secsTo(utc) // zero; these dates are the same even though I am in GMT-7

We need to tell date that it is a UTC date time with date.setTimeSpec(Qt::UTC):

#include <QtCore/QCoreApplication>
#include <QtCore/QDateTime>
#include <QtCore/QDebug>

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    QDateTime date = QDateTime::fromString("2010-10-25T10:28:58.570Z", "yyyy-MM-ddTHH:mm:ss.zzzZ");
    date.setTimeSpec(Qt::UTC);
    QDateTime local = date.toLocalTime();

    qDebug() << "utc: " << date;
    qDebug() << "local: " << local.toString();
    qDebug() << "hax: " << local.toString(Qt::SystemLocaleLongDate);

    return a.exec();
}

Output:

utc:  QDateTime("Mon Oct 25 10:28:58 2010") 
local:  "Mon Oct 25 03:28:58 2010" 
hax:  "Monday, October 25, 2010 3:28:58 AM"

I'm in GMT-7, so this is right.


Is using QDateTime::toString() not giving you expected results ?

Maybe you could try using a different format with QDateTime::toString(Qt::SystemLocaleLongDate) or QDateTime::toString(Qt::SystemLocaleShortDate).

Otherwise, I would try to use QLocale::dateTimeFormat() to get the local format as a QString and then use this string as the format parameter of QDateTime::toString(), but I don't think it will change anything.


Need Your Help

Error: No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SqlClient'

c# .net entity-framework ado.net entity-framework-6

I recently upgraded/updated Entity Framework in an old project from version 4 or 5 to version 6. Now I get this exception:

ThreadLocal Resource Leak and WeakReference

java thread-local weak-references

My limited understanding of ThreadLocal is that it has resource leak issues. I gather this problem can be remedied through proper use of WeakReferences with ThreadLocal (although I may have