2013-11-21 2 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

Выражения, которые не планирующим ведущих нулей (г, М) будет жадный. Это означает, что они будут использовать две цифры, даже если это поместит за пределы принятого диапазона значений и оставляет слишком мало цифр для других разделов. Например, следующая строка формата может означала 30 января, но М будет захватывать две цифры, в результате недействительной даты:

Поэтому лучше быть его, чтобы разделить их и разобрать отдельно

Редактировать: например, вы можете получить дату и время с

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.right (6) 'за время при использовании' startTime.left (8) 'для даты –

+0

So ... чрезвычайно противоречивые форматированные строки и очень пропуская документацию. Предположим, мне придется использовать это обходное решение. Спасибо за вашу помощь ^^ – LarissaGodzilla

2

Согласно документации QDateTime «h» означает «час без начального нуля» и «hh» означает «час с первым нолем». Таким образом, число «h» не обязательно соответствует количеству цифр, например, в strftime :)

Обходным способом было бы разделить временную метку на time_t с помощью функций std C/C++. Или просто добавьте пробел между 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, когда «мм» анализируется до «h». Но я предполагаю, что QT вычисляет слева направо, а 21 - вполне допустимое значение часа. Если это было «31923», ваши предположения были бы правильными.

Я бы выбрал пустой символ или точку с запятой между значениями h и m, если вы хотите избежать ведущих нулей.

Смежные вопросы