两个FILETIME, SYSTEMTIME 与 time_t 相互转换

本文详细介绍了FILETIME, SYSTEMTIME与time_t之间的转换方法。包括直接使用系统函数进行FILETIME与SYSTEMTIME的转换,以及通过计算实现time_t与其他两种时间类型的转换。

两个FILETIME, SYSTEMTIME 与 time_t 相互转换

注意:

     如果使用struct tm 通过 localtime和mktime做转换,需注意时区的问题!!!!!!

第一个

void TimetToSystemTime( time_t t, LPSYSTEMTIME pst )
{
   FILETIME ft;

   LONGLONG ll = Int32x32To64(t, 10000000) + 116444736000000000;
   ft.dwLowDateTime = (DWORD) ll;
   ft.dwHighDateTime = (DWORD)(ll >> 32);

   FileTimeToSystemTime( &ft, pst );
}

void SystemTimeToTimet( SYSTEMTIME st, time_t *pt )
{
   FILETIME ft;
   SystemTimeToFileTime( &st, &ft );

   LONGLONG ll;

   ULARGE_INTEGER ui;
   ui.LowPart = ft.dwLowDateTime;
   ui.HighPart = ft.dwHighDateTime;

   ll = (ft.dwHighDateTime << 32) + ft.dwLowDateTime;

   *pt = (DWORD)((LONGLONG)(ui.QuadPart - 116444736000000000) / 10000000);
}


本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/modena/archive/2005/01/13/251653.aspx

第二个

#####SYSTEMTIME 与 FILETIME相互转换#####
可以使用系统函数
FileTimeToSystemTime(&ftcreate,&stcreate);  

参数:
(lpFileTime As FILETIME, lpSystemTime As SYSTEMTIME)
说明
根据一个FILETIME结构的内容,装载一个SYSTEMTIME结构
返回值
Long,非零表示成功,零表示失败。会设置GetLastError
参数表
参数 类型及说明
lpFileTime FILETIME,包含了文件时间的一个结构
lpSystemTime SYSTEMTIME,用于装载系统时间信息的一个结构

#####SYSTEMTIME 与 time_t相互转换#####

void TimetToSystemTime( time_t t, LPSYSTEMTIME pst )
{
   FILETIME ft;
   LONGLONG ll = Int32x32To64(t, 10000000) + 116444736000000000;
   ft.dwLowDateTime = (DWORD) ll;
   ft.dwHighDateTime = (DWORD)(ll >> 32);

   FileTimeToSystemTime( &ft, pst );
}

void SystemTimeToTimet( SYSTEMTIME st, time_t *pt )
{
   FILETIME ft;
   SystemTimeToFileTime( &st, &ft );

   LONGLONG ll;

   ULARGE_INTEGER ui;
   ui.LowPart = ft.dwLowDateTime;
   ui.HighPart = ft.dwHighDateTime;

   ll = (ft.dwHighDateTime << 32) + ft.dwLowDateTime;

   *pt = (DWORD)((LONGLONG)(ui.QuadPart - 116444736000000000) / 10000000);
}


#### FileTimeToTime_t ####

void FileTimeToTime_t( FILETIME ft, time_t *t )
{
           LONGLONG ll;

           ULARGE_INTEGER            ui;
           ui.LowPart            = ft.dwLowDateTime;
           ui.HighPart            = ft.dwHighDateTime;

           ll            = ft.dwHighDateTime << 32 + ft.dwLowDateTime;

           *t            = ((LONGLONG)(ui.QuadPart - 116444736000000000) / 10000000);
}

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/zjnig711/archive/2008/04/15/2294151.aspx

本文来自优快云博客,转载请标明出处:http://blog.youkuaiyun.com/zjnig711/archive/2008/04/15/2294151.aspx

#include <iostream> #include <filesystem> #include <chrono> #include <vector> #include <algorithm> namespace fs = std::filesystem; // 将文件时间转换time_t time_t filetime_to_timet(const fs::file_time_type& ft) { using namespace std::chrono; auto sctp = time_point_cast<system_clock::duration>( ft - fs::file_time_type::clock::now() + system_clock::now() ); return system_clock::to_time_t(sctp); } // 递归搜索文件 void search_files(const fs::path& root, const std::string& extension, time_t start_time, time_t end_time, std::vector<fs::path>& results) { try { for (const auto& entry : fs::recursive_directory_iterator(root)) { if (fs::is_regular_file(entry)) { // 检查文件扩展名 std::string ext = entry.path().extension().string(); std::transform(ext.begin(), ext.end(), ext.begin(), ::tolower); // 检查时间范围 auto ftime = entry.last_write_time(); time_t crtime = filetime_to_timet(ftime); if (ext == extension && crtime >= start_time && crtime <= end_time) { results.push_back(entry.path()); } } } } catch (const fs::filesystem_error& e) { std::cerr << "文件系统错误: " << e.what() << std::endl; } } int main() { fs::path search_path = "D:/TEXT"; std::string target_ext = ".txt"; // 目标文件类型 std::vector<fs::path> found_files; // 设置时间范围(示例:2023年1月1日 - 2024年1月1日) struct std::tm start_tm = { 0 }; start_tm.tm_year = 25; // 2100-2000 start_tm.tm_mon = 5; // 6月 start_tm.tm_mday = 1; time_t start_time = std::mktime(&start_tm); struct std::tm end_tm = { 0 }; end_tm.tm_year = 25; // 2024-1900 end_tm.tm_mon = 5; end_tm.tm_mday = 2; time_t end_time = std::mktime(&end_tm); search_files(search_path, target_ext, start_time, end_time, found_files); // 输出结果 std::cout << "找到 " << found_files.size() << " 个匹配文件:\n"; for (const auto& path : found_files) { std::cout << "• " << path.string() << "\n"; } return 0; }
最新发布
06-02
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值