Статус: Участник
Группы: Участники
Зарегистрирован: 14.10.2021(UTC) Сообщений: 13  Сказал(а) «Спасибо»: 9 раз
|
Время выпуска сертификата и его срок годности имеет формат FILETIME, которые можно перевести в SYSTEMTIME методом CSP_FileTimeToSystemTime, но вот как дальше получить время с учётом часового пояса, т.е. не в utc? Может быть есть какой нибудь аналог SystemTymeToTzSpetificLocalTime начинающийся с CSP_...? в хэдерах такого метода нет
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,664   Сказал «Спасибо»: 571 раз Поблагодарили: 2297 раз в 1798 постах
|
ЯП\Задача какая?
1) c++ ? 2) utc to local time? В гугле?
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,664   Сказал «Спасибо»: 571 раз Поблагодарили: 2297 раз в 1798 постах
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,664   Сказал «Спасибо»: 571 раз Поблагодарили: 2297 раз в 1798 постах
|
|
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.10.2021(UTC) Сообщений: 13  Сказал(а) «Спасибо»: 9 раз
|
Автор: Андрей *  ЯП\Задача какая?
1) c++ ? 2) utc to local time? В гугле?
Это же под ios, тут предлагаемые варианты в гугле для win не подходят насколько понял... Задача отобразить даты с учётом пояса, сейчас это выполняется так, без учёта часового пояса: NSString* getNotBefore(PCCERT_CONTEXT *pCertContext) { FILETIME fileTime = (*pCertContext)->pCertInfo->NotBefore; SYSTEMTIME systemTime; CSP_FileTimeToSystemTime(&fileTime, &systemTime); return [NSString stringWithFormat:@"%d.%d.%d %d:%d", systemTime.wDay, systemTime.wMonth, systemTime.wYear, systemTime.wHour, systemTime.wMinute]; } Отредактировано пользователем 18 октября 2021 г. 13:54:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.10.2021(UTC) Сообщений: 13  Сказал(а) «Спасибо»: 9 раз
|
Автор: Андрей *  и на ios тоже должен такой быть? т.е. не нужен аналог начинающийся что то вроде с CSP_FileTimeToLocalFileTime?
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 396 раз в 366 постах
|
Добрый день. Проблема отображения поясного времени очень болезненна для любого программного окружения. Дело в том, что смещение времени не постоянно (часы преводят, часовые пояса меняют границы), кроме того даже не кратно целому часу (в большинстве случаев кратно 5 минутам) и есть полугодовые поправки в 1 секунду в зависимости от вращения земного шара. Другими словами, если нужна точность, то функция перевода времени должна это все учитывать. Либо, например, доверить ОС заботу об этом и запрашивать смещение от ОС. С другой стороны, если Вам каким-то образом уже известно смещение времени для пояса, то и FileTimeToLocalFileTime не нужно: просто трактуете FILETIME как 64-битное (без)знаковое целое число (ULONGLONG если не ошибаюсь) и прибавляете (или вычитаете) смещение в секундах умноженное на 10 миллионов (так как FILETIME считает 10-миллионные доли секунды). Выходит, что для получения московского времени надо прибавить 3 * 3600 * 10 млн = 108 миллиардов. Что-то вроде: Код:FILETIME fileTime = (*pCertContext)->pCertInfo->NotBefore;
LONG offset = 3 * 3600; // здесь получить актуальное смещение для пояса (в секундах)
(ULONGLONG) fileTime += offset * 10000000;
SYSTEMTIME systemTime;
CSP_FileTimeToSystemTime(&fileTime, &systemTime);
Например, если у Вас какая-то ИС с аккаунтом пользователя, можно дать пользователю возможность выбора часового пояса и рассчитывать смещение оттуда. В простейшем варианте - выбор пояса на страничке где показываете данные о времени сертификата. По сути в iOS то же самое уже есть, остается только как-то получить информацию о часовом поясе и его смещении от iOS. Еще вариант - получать отметку времени по гринвичу с какого-нибудь сервера и сравнивать с датой на устройстве, разница с округлением до 5 минут обычно и будет смещением. Отредактировано пользователем 19 октября 2021 г. 17:32:57(UTC)
| Причина: Не указана
|
 1 пользователь поблагодарил two_oceans за этот пост.
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.10.2021(UTC) Сообщений: 13  Сказал(а) «Спасибо»: 9 раз
|
Да, спасибо, смещения через offset будет достаточно
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 14.10.2021(UTC) Сообщений: 13  Сказал(а) «Спасибо»: 9 раз
|
Но ведь формат FILETIME = { DWORD dwLowDateTime; DWORD dwHighDateTime; } Как тут учесть смещение? если смещение пытаться прибавить следующим образом (ULONGLONG) fileTime += offset * 10000000; топоявляется ошибка связанная с приведением типов(пробовал по разному, например unsigned_int)
|
|
|
|
Статус: Эксперт
Группы: Участники
Зарегистрирован: 05.03.2015(UTC) Сообщений: 1,602  Откуда: Иркутская область Сказал(а) «Спасибо»: 110 раз Поблагодарили: 396 раз в 366 постах
|
Для удобства использования на 32-битных ОС Maйкрософт просто поделили 64-битное целое число на 2 части и объявили как структуру. Обратите внимание, что часть Low идет первой, что соответствует принципу x86 процессоров Intel - "младший байт по младшему адресу" Little Endian - поэтому в памяти представление двух 4-байтовых полей такое же как у 8-байтовой числовой целой переменной. Если у Вас другая целевая архитектура (какой-нибудь ARM с BigEndian), то возможны несоответствия, поэтому возможно компилятор и упирается. На FreePascal / Delphi я просто привожу к типу int64 либо QWORD - проверял, работает в 32-разрядных Windows приложениях. Какой тип подходит для 64-разрядных операций на С++ наверно Вам виднее (так как я в основном читаю программы на С++ и переписываю на паскале). Знаю что есть разница в длине переменных на разных компиляторах C++. Еще может быть проблема в самом выражении "offset * 10000000" связанная с переполнением типа, неявно выбранного компилятором для результата умножения, в этом случае offset можно указать подлиннее или присваивать "offset * 10000000" в длинную промежуточную переменную, это даст компилятору "подсказку", что надо ждать большое число.
Если не проходит прямое преобразование, то можно попробовать обойти через указатели. Объявляете переменную с типом "указатель на 64-битное число" и присваиваете в нее указатель на FILETIME. Потом разименуете указатель для сложения со смещением. При моем скромном знании синтаксиса Си++ полагаю что-то вроде такого: Код:ULONGLONG* fileTime2 = (void *) &fileTime;
ULONGLONG offset_ft=offset * 10000000;
(*fileTime2)+= offset_ft;
Насчет необходимости приведения типа в (void *) сомневаюсь, но иногда компиляторы упираются с указателями на разные типы не меньше чем с преобразованием, а "безтиповый" указатель со всеми другими указателями совместим и выручает.
Отредактировано пользователем 20 октября 2021 г. 19:52:03(UTC)
| Причина: Не указана
|
 1 пользователь поблагодарил two_oceans за этот пост.
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close