我正在尝试将字符串格式的时间戳转换为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”),为什么会这样,我该怎么做才能解决这个问题?
答案 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值之间找一个空格“或”分号。