处理时间偶尔会小小的纠结下,尤其是UTC和local的时差问题,下面直入主题:
1.UTC和local
FILETIME有2种时间标准UTC和local,在MFC界面程序获取的为local基准,后台数据库往往用UTC基准存储,两者的转化如下:
FILETIME ft_UTC,ft_local;
::LocalFileTimeToFileTime(&ft_local,&ft_UTC);
::FileTimeToLocalFileTime(&ft_UTC,&ft_local);
2.SYSTEMTIME和FILETIME
搞定了FILETIME,接下去就是与SYSTEMTIME如何相互转化:
FILETIME ft_tm;
SYSTEMTIME sys_tm;
::FileTimeToSystemTime(&ft_tm,&sys_tm);
::SystemTimeToFileTime(&sys_tm,&ft_tm);
3.CTime和SYSTEMTIME、FILETIME
想要将CTime转化为FILETIME,则必须通过中间桥梁SYSTEMTIME来过渡
FILETIME ft_tm;
CTime tNow(2010,8,12,10,10,00);
tNow.GetAsSystemTime(sys_tm);
::SystemTimeToFileTime(&sys_tm,&ft_tm); ->得到想要的FILETIME
::FileTimeToSystemTime(&ft_tm,&sys_tm);
tNow = CTime(sys_tm); ->得到想要的CTime
4.CFileTime、CFileTimeSpan、CTime、CTimeSpan
我们看下CFileTime的声明就明白了:
class CFileTime :public FILETIME
CFileTime结构内存与FILETIME相等,所以可以直接强制转化无需担心内存越界。
CFileTime是对FILETIME的外层封装,加了一些操作符=、+、-、+=、-=、<=、>=、!=...
CFileTimeSpan我想白痴都知道怎么用,唯一要明确的就是数量积:
static const ULONGLONG Millisecond = 10000;
static const ULONGLONG Second = Millisecond * 1000;
static const ULONGLONG Minute = Second * 60;
static const ULONGLONG Hour = Minute * 60;
static const ULONGLONG Day = Hour * 24;
static const ULONGLONG Week = Day * 7;
明白了吧?CFileTimeSpan的数量积是0.1纳秒,CTimeSpan的数量积是秒,
CFileTimeSpan = CTimeSpan*10000000
这样就方便我们直接操作FILETIME,而无需非得转成CTime处理。