FILETIME SYSTEMTIME tm time_t

本文介绍了一个用于处理时间转换的类封装,包括文件时间、系统时间、日历时间和 UNIX 时间戳之间的相互转换,详细解释了各个时间类型的定义与区别,并提供了具体的实现代码。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

TimeConvert.h

// TimeConvert.h: interface for the TimeConvert class.
//
//@anthor:TT
//@time:2012.11.22
//@introduction:今天由于处理一个时间,搞得焦头烂额,于是乎打算封装一个转换类,方便自己以后使用,
/*先说个概念:
Coordinated Universal Time(UTC):又称为世界标准时间;时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)到当前时刻的秒数。
比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。
Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。对于不同的编译器,是不同的。
但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。
*/
//这里面涉及了三个类型
/*
*1.FILETIME:结构持有的64位无符号的文件的日期和时间值。此值表示自1601年1月1日开始的100纳秒为单位的时间。
*2.SYSTEMTIME:这个和tm有点类似,代表系统时间
*3.tm:Systemtime-1900得到tm.year,其他的还有些差别
*4.time_t:是日历时间;其值表示从CUT(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间)
*到当前时刻的秒数。
*/
//////////////////////////////////////////////////////////////////////

#if !defined(AFX_TIMECONVERT_H__87F35906_DBD6_46F1_BF78_2FA34FCB8409__INCLUDED_)
#define AFX_TIMECONVERT_H__87F35906_DBD6_46F1_BF78_2FA34FCB8409__INCLUDED_

#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
#include <time.h>
#include<olectl.h.>
class TimeConvert  
{
public:
	static void SystemTimeToFileTime(const SYSTEMTIME*pst,FILETIME *pft);
	static void Time_tToFileName(time_t t,FILETIME *ft);
	static void TmToTime_t(tm &_t,time_t &t);
	static void Time_tToTm(time_t t,tm *_t);
	static void TmToSystemTime(const tm &t,SYSTEMTIME *st);
	static void SystemTimeTOTm(const SYSTEMTIME &st,tm*t);
	static void FileTimeToTime_t(const FILETIME  *ft,  time_t  *t);
	static void Time_tToSystemTime(time_t t, SYSTEMTIME *pst);
	static void FileTimeToSystemTime(const FILETIME *lpFileTime,SYSTEMTIME *lpSystemTime);
	static void SystemTimeToTime_T(SYSTEMTIME *st, time_t *pt );
	static void FileTimeToTm(const FILETIME *ft,tm *t);
	static void TmToFileTime(tm &t,FILETIME *ft);
	static void TimeFormat(char *dest,int length,const char *format,const tm*t);
private:
	TimeConvert();
	virtual ~TimeConvert();


};

#endif // !defined(AFX_TIMECONVERT_H__87F35906_DBD6_46F1_BF78_2FA34FCB8409__INCLUDED_)

TimeConvert.cpp

// TimeConvert.cpp: implementation of the TimeConvert class.
//
//////////////////////////////////////////////////////////////////////

#include "TimeConvert.h"

//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////

TimeConvert::TimeConvert()
{

}

TimeConvert::~TimeConvert()
{

}

void TimeConvert::FileTimeToSystemTime(const FILETIME *lpFileTime,SYSTEMTIME *lpSystemTime)
{
	::FileTimeToSystemTime(lpFileTime,lpSystemTime);
}

void TimeConvert::Time_tToSystemTime(time_t t, SYSTEMTIME *pst )
{
// 	FILETIME ft;
// 	Time_tToFileName(t,&ft);	
// 	FileTimeToSystemTime( &ft, pst );

	//另一种实现
	tm *m=localtime(&t);
	TmToSystemTime(*m,pst);
}
void TimeConvert::SystemTimeToTime_T(SYSTEMTIME *st, time_t *pt )
{  
	FILETIME ft;
	SystemTimeToFileTime( st, &ft);	
	FileTimeToTime_t(&ft,pt);
}

void TimeConvert::FileTimeToTime_t(const 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=(DWORD)((LONGLONG)(ui.QuadPart- 116444736000000000) /10000000);
}

void TimeConvert::SystemTimeTOTm(const SYSTEMTIME &st,tm*t)
{
	tm gm= {st.wSecond, st.wMinute, st.wHour, st.wDay, st.wMonth-1, st.wYear-1900, st.wDayOfWeek, 0, 0};
	memcpy(t,&gm,sizeof(tm));
}
void  TimeConvert::TmToSystemTime(const tm &t,SYSTEMTIME *st)
{
	SYSTEMTIME s={1900 + t.tm_year,1 + t.tm_mon,t.tm_wday,t.tm_mday,t.tm_hour,t.tm_min,t.tm_sec,0};
	memcpy(st,&s,sizeof(SYSTEMTIME));
}

void TimeConvert::Time_tToTm(time_t t,tm *_t)
{
	tm *tt=localtime(&t);
	memcpy(_t,tt,sizeof(tm));
}

void TimeConvert::TmToTime_t(tm &_t,time_t &t)
{
	t=mktime(&_t);
}
void TimeConvert::Time_tToFileName(time_t t,FILETIME *ft)
{
	LONGLONG ll = Int32x32To64(t, 10000000) + 116444736000000000;
	ft->dwLowDateTime = (DWORD) ll;
	ft->dwHighDateTime = (DWORD)(ll >> 32);	
}
void TimeConvert::FileTimeToTm(const FILETIME *ft,tm *t)
{
	time_t tm;
	FileTimeToTime_t(ft,&tm);
	Time_tToTm(tm,t);
}
void TimeConvert::TmToFileTime(tm &t,FILETIME *ft)
{
	time_t tm;
	TmToTime_t(t,tm);
	Time_tToFileName(tm,ft);
}
void TimeConvert::SystemTimeToFileTime(const SYSTEMTIME*pst,FILETIME *pft )
{
	::SystemTimeToFileTime(pst,pft);
}
void TimeConvert::TimeFormat(char *dest,int length,const char *format,const tm*t)//@param:length 为dest长度-1
{
	strftime(dest,length,format,t);
}
/*

这关系太TMD乱了吧.....晕了

后记总结:
systemtime与filetime可以通过函数直接转化:FileTimeToSystemTime 和SystemTimeToFileName;
tm和time_t也可以直接转化:localtime()和mktime();
其他转化需要通过中间步骤
Sytemtime和tm有些类似,可以通过加减转化(PS:画个图之后,更好理解)
*/






#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; // 设置时间范围(示例:20231月1日 - 20241月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
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值