| 
	Статус: Участник
 Группы: Участники
 Зарегистрирован: 14.10.2021(UTC) Сообщений: 13 Сказал(а) «Спасибо»: 9 раз
 | 
            
		      
                Время выпуска сертификата и его срок годности имеет формат FILETIME, которые можно перевести в SYSTEMTIME методом CSP_FileTimeToSystemTime, но вот как дальше получить время с учётом часового пояса, т.е. не в utc? Может быть есть какой нибудь аналог SystemTymeToTzSpetificLocalTime начинающийся с CSP_...? в хэдерах такого метода нет | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,969  Сказал «Спасибо»: 605 разПоблагодарили: 2346 раз в 1842 постах
 
 | 
            
		      
                ЯП\Задача какая?
 1) c++ ?
 2) utc to local time? В гугле?
 
 
 | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Сотрудник
 Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,969  Сказал «Спасибо»: 605 разПоблагодарили: 2346 раз в 1842 постах
 
 |  | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
            
        
            
            
    | 
	Статус: Сотрудник
 Группы: Участники
 Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,969  Сказал «Спасибо»: 605 разПоблагодарили: 2346 раз в 1842 постах
 
 |  | 
|  | 
    | 
             | 
            
         | 
    |  | 
        
        
        
    
        
            
            
    | 
	Статус: Участник
 Группы: Участники
 Зарегистрирован: 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 разПоблагодарили: 397 раз в 367 постах
 
 | 
            
		      
                Добрый день. Проблема отображения поясного времени очень болезненна для любого программного окружения. Дело в том, что смещение времени не постоянно (часы преводят, часовые пояса меняют границы), кроме того даже не кратно целому часу (в большинстве случаев кратно 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 разПоблагодарили: 397 раз в 367 постах
 
 | 
            
		      
                Для удобства использования на 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