Russian Qt Forum

Qt => Общие вопросы => Тема начата: DarkHobbit от Март 23, 2021, 07:47



Название: QDateTime::fromString() и временная зона
Отправлено: DarkHobbit от Март 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, это приведёт к ошибкам. Ну или самому парсить. Или парсить с игнором, а потом как-то вытаскивать таймозону отдельно?


Название: Re: QDateTime::fromString() и временная зона
Отправлено: kambala от Март 23, 2021, 10:38
1. https://github.com/qt/qtbase/blob/5.15.2/src/corelib/time/qdatetime.cpp изучай историю или блэйм
2. можно руками находить Z, отрезать ее и все что дальше чтоб строка стала валидной, а зону самому назначить через ручной парсинг


Название: Re: QDateTime::fromString() и временная зона
Отправлено: DarkHobbit от Март 23, 2021, 14:25
1. Спасибо за ссылку, нашёл я этот коммит (https://github.com/qt/qtbase/commit/68f19fb630dc02463c2d61fc511de7407687795e). Судя по дате (Jun 20, 2017), это как раз Qt 5.10. Смущает, правда, что в официальном списке (https://wiki.qt.io/New_Features_in_Qt_5.10) про timezone ничего нет. Напишу про 5.10, но в целом вопрос остаётся открытым.

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

Спасибо за наводки, подумаю ещё.