Интерпретация строки временной метки в QDateTime

Вопрос или проблема

Я пытаюсь преобразовать строку ниже в 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, и причиной этого является некорректно заданная строка формата.

Анализ строки формата

  1. Структура строки: Ваша строка содержит:

    • Дату: 2024-10-22
    • Время: 16:44:29.746
    • Часовой пояс: -0400
  2. Значение символов формата:

    • yyyy — год (4 цифры)
    • MM — месяц (2 цифры)
    • dd — день (2 цифры)
    • T — фиксированное разделительное значение, указывающее на начало времени
    • hh — часы в 12-часовом формате (вам стоит использовать HH для 24-часового)
    • mm — минуты (2 цифры)
    • ss — секунды (2 цифры)
    • zzz — миллисекунды (3 цифры)
    • tt — не правильно используется, поскольку tt применяется для AM/PM (большая ошибка в вашем шаблоне здесь, вместо этого нужно просто указать информацию о часовом поясе)
  3. Правильный формат: Ваша строка формата должна выглядеть так:

    "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, которая детализирует синтаксис форматирования, чтобы избежать подобного рода ошибок в будущем.

Оцените материал
Добавить комментарий

Капча загружается...