QDateTime::fromString не принимает мою QString?

#c #qt #qstring #qdatetime

#c #qt #qstring #qdatetime

Вопрос:

У меня есть файл .txt, который заполнен строками, подобными приведенным ниже:

  • 2011-03-03 03.33.13.222 4 2000 Информационный БИЗНЕС … и т.д. блабла
  • 2011-03-03 03.33.13.333 4 2000 Информационный БИЗНЕС … и т.д. блабла
  • 2011-03-03 03.33.13.444 4 2000 Информационный БИЗНЕС … и т.д. блабла

В какой-то момент моего кода я выполняю некоторые вычисления и поиск, где я извлекаю только даты из начала каждой строки. Теперь, когда я правильно позиционируюсь в начале файла, я извлекаю только дату и время (с миллисекундами) «пример: 2011-03-03 03.33.13.444» и преобразую в объект QDateTime.

Предполагая, что мой указатель на файл правильно расположен в начале определенной строки, с помощью readLine я считываю текстовую строку datetime и преобразую в объект QDateTime

 QDateTime dt;
char lineBuff[1024];
qint64 lineLength;
lineLength=file.readLine(lineBuff, 24); 
dt = QDateTime::fromString(QString(lineBuff),"yyyy-MM-dd HH.mm.ss.zzz");
  

Это абсолютно правильно.

Но вот в чем проблема:

Когда я делаю то же самое, как это:

 QDateTime dt;
QByteArray baLine;
char lineBuff[1024];
file.seek(nGotoPos); //QFile, nGotoPos = a position in my file
QString strPrev(baLine); // convert bytearry to qstring -> so i can use mid()

// calculate where the last two newline characters are in that string
int nEndLine = strPrev.lastIndexOf("n");
int nStartLine = strPrev.lastIndexOf("n", -2);

QString strMyWholeLineOfTextAtSomePoint = strPrev.mid(nStartLine,nEndLine);
QString strMyDateTime = strMyWholeLineOfTextAtSomePoint.left(24); 

// strMyDateTime in debug mode shows me that it is filled with my string 
// "ex: 2011-03-03 03.33.13.444" 

// THE PROBLEM
// But when i try to covert that string to my QDateTime object it is empty
dt = QDateTime::fromString(strMyDateTime ,"yyyy-MM-dd HH.mm.ss.zzz");

dt.isValid() //false
dt.toString () // "" -> empty ????
  

НО ЕСЛИ Я СДЕЛАЮ:

dt = QDateTime::fromString(«2011-03-03 03.33.13.444″,»гггг-ММ-дд ЧЧ.мм.сс.zzz»); Тогда все в порядке.

В чем может быть проблема с моей QString? Нужно ли мне добавлять к strMyDateTime » 0″ или мне нужны какие-то другие преобразования??

Ответ №1:

Ваша строка содержит дополнительные символы, скорее всего, пробел в начале. Ваша строка формата состоит из 23 символов, и вы используете left (24), поэтому должен быть один дополнительный символ. Вы сказали в комментарии к ответу Стивена Чу, что при изменении 24 на 23 отбрасывается последний миллисекундный символ, поэтому дополнительный символ должен быть в начале.

Ответ №2:

"2011-03-03 03.33.13.444" на самом деле имеет длину 23 символа, а не 24. Ваша извлеченная строка, вероятно, имеет дополнительный символ в конце?

Комментарии:

1. я изменил это и безуспешно. Что так отличается от readLine, в документах говорится, что он добавляет » 0″. Я не думаю, что мне нужно это делать для QString. Редактировать: когда я меняю значение на 23, я получаю символ меньше с правой стороны (отсутствует третий компонент миллисекунды)

2. Тогда у вас может быть невидимый символ в начале извлеченной строки. Я предполагаю, что это LF или CR.

3. Вы правы — у меня, вероятно, был пробел в начале, я бросил trimmed() и теперь все хорошо. Спасибо