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: 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:画个图之后,更好理解) */