Неожиданно обнаружил, что оказывается QDateTime плохо поддерживает часовые пояса.
Читает время со смещением в формате ISO 8601 нормально:
QDateTime time = QDateTime::fromString("1999-06-15T13:24:51-01:00", Qt::ISODate);
qDebug() << time.toString(Qt::ISODate);
qDebug() << time.toUTC().toString(Qt::ISODate);
qDebug() << time.toUTC().toLocalTime().toString(Qt::ISODate);
Выдает:
"1999-06-15T13:24:51"
"1999-06-15T14:24:51"
"1999-06-15T18:24:51"
А вот перевести в строку со смещением похоже оно не умеет. Интернеты сказали, что без костыля здесь никак. Хочу представить на суд общественности свой вариант:
QString dateTimeToISOString(QDateTime dateTime)
{
QDateTime dateTimeUtc = dateTime.toUTC();
dateTime.setTimeSpec(Qt::UTC);
int sec = dateTimeUtc.secsTo(dateTime);
QString dateTimeString = dateTime.toString("yyyy-MM-ddThh:mm:ss");
if (sec != 0) {
int h = qAbs(sec/3600);
int m = qAbs(sec%3600/60);
QString offsetString = QString("%1:%2")
.arg(h, 2, 10, QLatin1Char('0'))
.arg(m, 2, 10, QLatin1Char('0'));
if (sec > 0) {
return dateTimeString + "+" + offsetString;
} else {
return dateTimeString + "-" + offsetString;
}
}
return dateTimeString + "Z";
}
Хочется узнать какие есть косяки и подводные камни.