Кто-нибудь знает более чистый способ получить часовой пояс, включенный в строковое представление ISO QDateTime?
Я должен иметь возможность просто использовать следующее:
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate);
но это всегда выходит в формате UTC:
2014-02-24T01:29:00Z
В настоящее время я работаю над этим, чтобы заставить TimeSpec быть Qt :: offsetFromUtc, явно установив смещение, которое я изначально получаю из QDateTime.
QDateTime now = QDateTime::currentDateTime();
int offset = now.offsetFromUtc();
now.setOffsetFromUtc(offset);
qDebug() << now.toString(Qt::ISODate);
Это дает то, что изначально ожидалось:
2014-02-24T01:29:00+02:00
Кто-нибудь знает, как сделать это более чистым способом или это должно быть зарегистрировано как ошибка?
РЕДАКТИРОВАТЬ: я использую Qt5.2.1
ОБНОВИТЬ:
Следующая небольшая программа показывает, что я имею в виду:
#include <QtCore/QDateTime>
#include <QtCore/QDebug>
int main(int argc, int argv){
qDebug() << QDateTime::currentDateTime().toString(Qt::ISODate);
qDebug() << QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate);
QDateTime now = QDateTime::currentDateTime();
int offset = now.offsetFromUtc();
now.setOffsetFromUtc(offset);
qDebug() << now.toString(Qt::ISODate);
return 0;
}
Создается следующий вывод:
"2014-02-24T10:20:49""2014-02-24T08:20:49Z""2014-02-24T10:20:49+02:00"
Последняя строка — та, которая ожидается. Обратите внимание, что второй раз был преобразован в UTC, что не то, что нужно.
Этого не было до 5.2, но оно было интегрировано в него. Кажется, что вы получили неверный синтаксис, потому что он должен быть таким:
QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate)
в соответствии с соответствующий багрепорт. Обратите внимание, что toTimeSpec (Qt :: OffsetFromUTC) позвони посередине.
Когда мне это нужно, я использую следующий обходной путь:
QDateTime::currentDateTime().toOffsetFromUtc(QDateTime::currentDateTime().offsetFromUtc()).toString(Qt::ISODate);
Я не проверял, работает ли @lpappa над новыми версиями. Описанный выше обходной путь был протестирован на Qt 5.3
Кажется, это работает с точностью до миллисекунды и сохранением информации о часовом поясе:
#include <QDebug>
#include <QTimeZone>
QString datetimeToIsoMs(const QDateTime& dt)
{
// An ISO-8601 format preserving millisecond accuracy and timezone.
// Equivalent in moment.js: thing.format("YYYY-MM-DDTHH:mm:ss.SSSZ")
// Example: '2016-06-02T10:04:03.588+01:00'
// Here we also allow 'Z' for UTC.
// In Qt, BEWARE:
// dt; // QDateTime(2016-06-02 10:28:06.708 BST Qt::TimeSpec(LocalTime))
// dt.toString(Qt::ISODate); // "2016-06-02T10:28:06" -- DROPS timezone
QString localtime = dt.toString("yyyy-MM-ddTHH:mm:ss.zzz");
int offsetFromUtcSec = dt.offsetFromUtc();
// FOR TESTING: offsetFromUtcSec = -(3600 * 2.5);
QString tzinfo;
if (offsetFromUtcSec == 0) {
tzinfo = "Z";
} else {
QString sign = offsetFromUtcSec < 0 ? "-" : "+";
offsetFromUtcSec = abs(offsetFromUtcSec);
int hours = offsetFromUtcSec / 3600;
int minutes = (offsetFromUtcSec % 3600) / 60;
tzinfo += QString("%1%2:%3").arg(sign)
.arg(hours, 2, 10, QChar('0'))
.arg(minutes, 2, 10, QChar('0'));
// http://stackoverflow.com/questions/2618414/convert-an-int-to-a-qstring-with-zero-padding-leading-zeroes
}
return localtime + tzinfo;
}
QString datetimeToIsoMsUtc(const QDateTime& dt)
{
QDateTime utc_dt = dt.toTimeSpec(Qt::UTC);
return datetimeToIsoMs(utc_dt);
}
QDateTime isoToDateTime(const QString& iso)
{
return QDateTime::fromString(iso, Qt::ISODate);
}