Russian Qt Forum
Ноябрь 23, 2024, 14:35 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: QDateTime::fromString() и временная зона  (Прочитано 4105 раз)
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« : Март 23, 2021, 07:47 »

Добрый день.

Как известно, у QDateTime есть дополнтельный спецификатор 't', позволяющий читать из строки таймзону, например, 'Z'. Но в документации довольно невнятно прописано, что появился он относительно недавно, и когда конкретно - непонятно. Я на грабли налетел только когда программа отказалась корректно работать на Qt 5.5.1 (возвращается пустой невалидный QDateTime).

Более вдумчивое чтение справки показало, что спецификатор 't' упоминается одновременно со второй реализацией QDateTime::fromString() с тремя параметрами (хотя на современных Qt он и с двумя параметрами работает). Реализация с тремя параметрами отсылает к классу QCalendar, про который уже явно написано, что появился он в 5.14. Я предположил было, что тогда появился и спецификатор 't'. Но нет: в самосборной Qt 5.10 он работает!

Собственно, вопроса два:

1. Так в какой же версии Qt он появился? Мне хотя бы условную компиляцию корректно написать, это программа-минимум.

2. Что посоветуете делать в более старых версиях? (Это программа-максимум.) Мне это нужно для парсинга в DoubleContact (см. подпись) структур vMessage, в которых попадается вот такое:

Код:
DATE:20171217T084725Z

Можно либо игнорить таймзону, но если вдруг там будет не только Z, это приведёт к ошибкам. Ну или самому парсить. Или парсить с игнором, а потом как-то вытаскивать таймозону отдельно?
« Последнее редактирование: Март 23, 2021, 07:50 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
kambala
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 4747



Просмотр профиля WWW
« Ответ #1 : Март 23, 2021, 10:38 »

1. https://github.com/qt/qtbase/blob/5.15.2/src/corelib/time/qdatetime.cpp изучай историю или блэйм
2. можно руками находить Z, отрезать ее и все что дальше чтоб строка стала валидной, а зону самому назначить через ручной парсинг
Записан

Изучением C++ вымощена дорога в Qt.

UTF-8 has been around since 1993 and Unicode 2.0 since 1996; if you have created any 8-bit character content since 1996 in anything other than UTF-8, then I hate you. © Matt Gallagher
DarkHobbit
Самовар
**
Offline Offline

Сообщений: 197


Просмотр профиля
« Ответ #2 : Март 23, 2021, 14:25 »

1. Спасибо за ссылку, нашёл я этот коммит. Судя по дате (Jun 20, 2017), это как раз Qt 5.10. Смущает, правда, что в официальном списке про timezone ничего нет. Напишу про 5.10, но в целом вопрос остаётся открытым.

2. Ну Z - это же только пример (эквивалентный GMT). Сами кутешники в качестве примера приводят не Z, а CEST. Видимо, придётся по длине резать и таймзоной считать всё, что после секунд (ну или второй буквенный символ после T ловить, но это такая себе идея, на парсинге MPB-файла с тысячей SMSок программа и так начинает подтормаживать).

Спасибо за наводки, подумаю ещё.
« Последнее редактирование: Март 23, 2021, 14:27 от DarkHobbit » Записан

Мои проекты на Qt: DoubleContact, LInvert
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.046 секунд. Запросов: 22.