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 のように、必ずしも桁数に対応しているわけではありません :)

回避策は、std C/C++ 関数を使用してタイムスタンプを解析して time_t にすることです。または、2 から 1923 の間にスペースを追加し、それに応じて fromString の式を変更します。

于 2013-11-21T13:14:49.810 に答える
1

ここの警告を参照してください: http://qt-project.org/doc/qt-5.0/qtcore/qdate.html#fromString-2

先行ゼロ (d, M) を予期しない式はgreedy になります。これは、許容される値の範囲外になり、他のセクションの桁数が少なすぎる場合でも、2 桁を使用することを意味します。たとえば、次の書式文字列は 1 月 30 日を意味する可能性がありますが、M は 2 桁を取得するため、無効な日付になります。

したがって、それらを分割して個別に解析するのが最善です

編集:たとえば、日付と時刻を取得できます

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 に答える
1

'h' は「先行ゼロのない時間」を表します。http://harmattan-dev.nokia.com/docs/library/html/qt4/qdatetime.htmlの qt ドキュメントには論理的な誤りがあると思います

「21923」は、「h」の前に「mm」が解析される場合、2:19:23 を表します。しかし、QT は左から右に計算され、21 は完全に有効な時間値だと思います。それが「31923」だった場合、あなたの推測は正しいでしょう。

先行ゼロを避けたい場合は、h 値と m 値の間に空白文字 ' ' またはセミコロンを使用します。

于 2013-11-21T13:17:51.353 に答える