为什么我的时间戳转换不正确

时间:2013-11-21 13:10:28

标签: qt qdatetime

我正在尝试将字符串格式的时间戳转换为msecs,因为epoch,就像这样:

QString startTime("20131030 21923"); //2013-10-30 02:19:23 
auto date = QDateTime::fromString(startTime, "yyyyMMdd hmmss");
auto secsSinceEpoch = date.toTime_t();

结果(secsSinceEpoch)是1383163763,转换为2013-10-30 21:09:23。 所以看起来我的格式字符串被错误地解释(如“yyyyMMdd hhmss”),为什么会这样,我该怎么做才能解决这个问题?

3 个答案:

答案 0 :(得分:2)

根据QDateTime的文档,“h”表示“没有前导零的小时”,“hh”表示“带有前导零的小时”。因此,“h”的数量不一定与数字的位数相对应,如strftime:)

解决方法是使用std C / C ++函数将时间戳解析为time_t。或者只是在2到1923之间添加一个空格并相应地更改fromString中的表达式。

答案 1 :(得分:1)

请在此处查看警告:http://qt-project.org/doc/qt-5.0/qtcore/qdate.html#fromString-2

  

不期望前导零(d,M)的表达式将是   贪婪即可。这意味着他们将使用两位数,即使这将被放置   它们超出了可接受的值范围,并且数字太少   对于其他部分。例如,以下格式字符串可以   意味着1月30日,但M将抓住两位数,结果是   无效日期:

所以最好将它们分开并单独解析

编辑:例如,您可以使用

获取日期和时间
QDate date = QDate::fromString(startTime.left(8), "yyyMMdd");
startTime[8]=0;//replacing the " " with a 0
QTime time = QTime::fromString(startTime.right(6), "hhmmss");//hour becomes a 2 digit
QDateTime fullDate(date,time);
auto secsSinceEpoch = fullDate.toTime_t();

答案 2 :(得分:1)

'h'代表“没有前导零的小时”。我认为http://harmattan-dev.nokia.com/docs/library/html/qt4/qdatetime.html

中的qt文档存在逻辑谬误 当在“h”之前解析“mm”时,“21923”代表2:19:23。但我猜QT从左到右计算,21是完全有效的小时值。如果它是“31923”,那么你的假设是正确的。

如果你想避免前导零,我会在h和m值之间找一个空格“或”分号。