9

有谁知道将时区包含在 QDateTime 的 ISO 字符串表示中的更简洁的方法?

我应该能够使用以下内容:

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,这不是我们想要的。

4

3 回答 3

5

这在 5.2 之前不存在,但它已集成在其中。看来您的语法不正确,因为它应该是这样的:

QDateTime::currentDateTime().toTimeSpec(Qt::OffsetFromUTC).toString(Qt::ISODate)

根据相应的错误报告。注意toTimeSpec(Qt::OffsetFromUTC)在中间调用。

于 2014-02-24T03:26:42.513 回答
4

这似乎可行,具有毫秒精度并保留时区信息:

#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);
}
于 2016-06-02T09:57:48.040 回答
4

当我需要时,我使用以下解决方法:

QDateTime::currentDateTime().toOffsetFromUtc(QDateTime::currentDateTime().offsetFromUtc()).toString(Qt::ISODate);

我还没有测试过@lpappa 是否正在开发新版本。上述解决方法已在 Qt 5.3 上测试过

于 2017-01-11T13:18:07.450 回答