LINUX.ORG.RU

[C++][Qt][костыль] QDateTime и часовые пояса

 ,


0

2

Неожиданно обнаружил, что оказывается 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";
}

Хочется узнать какие есть косяки и подводные камни.



Последнее исправление: SSZB (всего исправлений: 1)

> Хочется узнать какие есть косяки и подводные камни.

Не скажу про подводные камни, но можно так посчитать offsetString:

QString offsetString = QTime().addSecs(qAbs(sec)).toString("hh:mm");

rival ★★
()

> Хочу представить на суд общественности свой вариант

boost::date_time

one_more_hokum ★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.