0

我正在尝试将字符串格式的时间戳转换为自纪元以来的毫秒,如下所示:

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”),为什么会这样,我该怎么做才能解决这个问题?

4

3 回答 3

2

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

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

于 2013-11-21T13:14:49.810 回答
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 值之间使用空白字符 ' ' 或分号。

于 2013-11-21T13:17:51.353 回答
1

请参阅此处的警告:http: //qt-project.org/doc/qt-5.0/qtcore/qdate.html#fromString-2

不期望前导零 (d, M) 的表达式将是 greedy。这意味着它们将使用两位数字,即使这会使它们超出可接受的值范围并且为其他部分留下太少的数字。例如,以下格式字符串可能表示 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();
于 2013-11-21T13:16:09.447 回答