Вопрос или проблема
Я пытаюсь преобразовать строку ниже в QDateTime:
QString timestampStr = "2024-10-22T16:44:29.746-0400"
QDateTime timestamp;
timestamp.fromString(timestampStr, "yyyy-MM-ddThh:mm:ss.zzztt");
Но после выполнения кода временная метка по-прежнему недействительна, что указывает на то, что преобразование не удалось. Должно быть, что-то не так с шаблоном формата.
Я думаю, что строка формата правильная согласно этому документу Qt. Я уже некоторое время экспериментирую с строками формата и, должно быть, упустил что-то очевидное.
Я подозреваю, что проблема в “tt”, который, согласно документации, должен правильно интерпретировать -0400. Существует ли документ (специфичный для синтаксиса Qt), который объясняет, что означают все буквы и как они интерпретируются?
Ответ или решение
Для того чтобы правильно интерпретировать строку временной метки в QDateTime, важно точно указать формат, соответствующий строке, которую вы пытаетесь преобразовать. Рассмотрим вашу строку временной метки:
QString timestampStr = "2024-10-22T16:44:29.746-0400";
У вас возникла проблема с преобразованием этой строки в объект QDateTime, и причиной этого является некорректно заданная строка формата.
Анализ строки формата
-
Структура строки: Ваша строка содержит:
- Дату:
2024-10-22
- Время:
16:44:29.746
- Часовой пояс:
-0400
- Дату:
-
Значение символов формата:
yyyy
— год (4 цифры)MM
— месяц (2 цифры)dd
— день (2 цифры)T
— фиксированное разделительное значение, указывающее на начало времениhh
— часы в 12-часовом формате (вам стоит использоватьHH
для 24-часового)mm
— минуты (2 цифры)ss
— секунды (2 цифры)zzz
— миллисекунды (3 цифры)tt
— не правильно используется, посколькуtt
применяется для AM/PM (большая ошибка в вашем шаблоне здесь, вместо этого нужно просто указать информацию о часовом поясе)
-
Правильный формат: Ваша строка формата должна выглядеть так:
"yyyy-MM-ddTHH:mm:ss.zzzzzz"
Но так как у нас есть часы, которые смещаются от нуля, нам нужно добавить обработку часового пояса отдельно, поскольку QDateTime не поддерживает текущий формат
-0400
напрямую в строке формата.
Правильный код преобразования
QString timestampStr = "2024-10-22T16:44:29.746-0400";
QDateTime timestamp;
// Извлечение часового пояса
QString datePart = timestampStr.left(29); // Включаем все, кроме часового пояса
QString timezonePart = timestampStr.mid(29); // Часовой пояс
// Преобразование строки в QDateTime
timestamp = QDateTime::fromString(datePart, "yyyy-MM-ddTHH:mm:ss.zzz");
if (timestamp.isValid()) {
// Применяем смещение относительно времени
QTimeZone timeZone(QByteArray::fromStdString(timezonePart.toStdString()));
timestamp.setTimeZone(timeZone);
// Теперь QDateTime должен быть корректен
} else {
// Ошибка обработки
qDebug() << "Невозможно преобразовать временную метку." ;
}
Заключение
Используя вышеописанный подход, вы сможете правильно интерпретировать строку временной метки в QDateTime с учетом всех аспектов форматирования. Рекомендуется также ознакомиться с документацией по QDateTime от Qt, которая детализирует синтаксис форматирования, чтобы избежать подобного рода ошибок в будущем.