2013-11-21 18 views
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」),爲什麼是這樣,我能做些什麼來解決這個問題?

回答

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(); 
+0

所以你告訴我有沒有辦法在我的字符串中有一個數字小時? – LarissaGodzilla

+0

雖然你可以通過操縱字符串來改變它(用'0'代替空格,並且在'startTime.left(8)'爲 –

+0

的時候用'startTime.right(6) ...非常違反直覺的格式化字符串和一個非常令人迷惑的文檔然後猜猜我必須使用該解決方法。感謝您的幫助^^ – LarissaGodzilla

2

根據QDateTime的文檔,「h」表示「沒有前導零的小時」,「hh」表示「前導零的小時」。因此,「h」的數量不一定對應於strftime中的數字位數:)

解決方法是使用std C/C++函數將時間戳解析爲time_t。或者只是在2和1923之間添加一個空格,並相應地在fromString中更改表達式。

+0

據我所知,「h」表示一位數字或兩位數字。所以「02」和「2」應該都可以。 – LarissaGodzilla

1

'h'代表「小時沒有領先的零」。我認爲在qt文檔中存在邏輯謬誤http://harmattan-dev.nokia.com/docs/library/html/qt4/qdatetime.html

「21923」將代表2:19:23,當「mm」在「h」之前被解析時,它將代表2:19:23。但我想QT從左到右計算,21是完全有效的小時值。如果它是「31923」,那麼你的假設是正確的。

如果你想避免前導零,我會在h和m值之間留一個空白的char或分號。