shasoft
@shasoft

Как преобразовать FILETIME в time_t на C++?

В одном месте дата изменения определяется как
std::filesystem::last_write_time(filepath);
и с помощью кода
// Преобразовать дату/время файла в time_t
		template <typename TP> std::time_t to_time_t(TP tp)
		{
			using namespace std::chrono;
			auto sctp = time_point_cast<system_clock::duration>(tp - TP::clock::now()
				+ system_clock::now());
			return system_clock::to_time_t(sctp);
		}

преобразуется в time_t.

В другом месте дата последнего изменения определяется в виде FILETIME и переводится в time_t с помощью кода
static std::time_t to_time_t(FILETIME ft)
		{
			std::time_t ret = 0;
			// Преобразовать в time_t
			ULARGE_INTEGER ull;
			ull.LowPart = ft.dwLowDateTime;
			ull.HighPart = ft.dwHighDateTime;
			ret = (ull.QuadPart / 10000000ULL - 11644473600ULL);
			return ret;
		}


Но есть проблема, время в time_t не совпадает. У меня разница в 1 секунду, хотя дата изменения файла не меняется. Есть какой-то способ преобразования чтобы значения были идентичны?

p.s.возникает идея просто минусовать 1 секунду во втором случае, однако не уверен что это всегда будет правильным вариантом. Всё таки это формулу не просто так придумали. Этот способ с минусованием не подходит, так как нашел вариант, когда время совпало :(
  • Вопрос задан
  • 50 просмотров
Решения вопроса 1
shasoft
@shasoft Автор вопроса
Вот такой код получился. Он даёт идентичный результат. Как минимум для тестовых примеров
// Преобразовать в time_t
		static std::time_t to_time_t(const ULARGE_INTEGER& ull)
		{
			// Преобразовать в time_t
			std::time_t ret = (ull.QuadPart / 10000000ULL - 11644473600ULL);
			// Правильное оуркгление
			ULONGLONG QuadPartMod = ull.QuadPart % 10000000ULL;
			if (QuadPartMod >= 5000000ULL) {
				ret++;
			}
			//
			return ret;
		}
		static std::time_t to_time_t(const FILETIME& ft)
		{
			std::time_t ret = 0;
			// Преобразовать в ULARGE_INTEGER
			ULARGE_INTEGER ull;
			ull.LowPart = ft.dwLowDateTime;
			ull.HighPart = ft.dwHighDateTime;
			// Преобразовать в time_t
			return to_time_t(ull);
		}
		template <typename TP> std::time_t to_time_t(TP tp)
		{
			// Преобразовать в ULARGE_INTEGER
			ULARGE_INTEGER ull;
			ull.QuadPart = tp.time_since_epoch().count();
			// Преобразовать в time_t
			return to_time_t(ull);
		}
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Войти через центр авторизации
Похожие вопросы
24 сент. 2020, в 19:48
5000 руб./за проект
24 сент. 2020, в 19:40
600 руб./в час