如何正确转换日期时间字符串的utc时间位移?

问题描述:

我在版本4.6.2中使用Qt并尝试使用UTC时间位移信息将自定义日期字符串转换为QDateTime对象。如何正确转换日期时间字符串的utc时间位移?

QString format = "yyyy-MM-ddThh:mm:ss.zzz+hh:mm" 
QDateTime dateTime = QDateTime::fromString("2017-10-18T08:30:02.000+01:00", format); 
qDebug() << dateTime.toString(format); 

输出是一个空字符串。

如果我省去格式字符串和日期字符串中的时间位移信息,我会按照预期得到日期字符串:2017-10-18T08:30:02.000。

根据Qt documentation of QDateTime::fromString,时间位移没有明确的格式占位符。

我也尝试以下

QDateTime dateTime = QDateTime::fromString("2017-10-18T08:30:02.000+01:00", Qt::ISODate); // ISO 8601 
qDebug() << dateTime.toString(Qt::ISODate); 

但结果是2017-10-18T00:00:00。

那么,我该如何正确转换从日期时间字符串utc时间位移?

+5

有用? https://bugreports.qt.io/browse/QTBUG-11623 – Tarod

+0

交流,感谢您的评论塔罗德!很明显,它是Qt 4.6中的一个Bug,并在Qt 4.7中修复。我意识到我在版本4.6.2中使用Qt。所以我会尝试用更新的Qt版本解决我的问题。 – kbisang

+0

伟大的@kbisang!让我们知道,如果你用不同的Qt版本得到你想要的东西。 – Tarod

如果你需要留了Qt 4.6,你可以手动查找位移,并添加区别,如果存在:

QString strDate = "2017-10-18T08:30:02.000+01:00"; 
QStringList tokens = strDate.split('+'); 

QString format = "yyyy-MM-ddThh:mm:ss.zzz"; // format without displacement 
QDateTime dateTime = QDateTime::fromString(tokens[0], format); 

if (tokens.count() == 2) { // input has displacement 
    QString format = "hh:mm"; 
    int msecs = QTime::fromString(tokens[1], format).msecsSinceStartOfDay(); 
    dateTime = dateTime.addMSecs(msecs); 
} 

qDebug() << dateTime.toString(format);