Coordinated Universal Time(UTC):又称为世界标准时间;
比如,中国内地的时间与UTC的时差为+8,也就是UTC+8。
Calendar Time:日历时间,是用“从一个标准时间点到此时的时间经过的秒数”来表示的时间。日历时间对于不同的编译器,是不同的。 但是无论你在哪一个时区,在同一时刻对同一个标准时间点来说,日历时间都是一样的。
例如,time_t就是一种日历时间,其值表示从UTC(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间) 到当前时刻的秒数。
这里面涉及了四个类型 :
*1.FILETIME:结构持有的64位无符号的文件的日期和时间值。此值表示自UTC(Coordinated Universal Time)时间1601年1月1日开始的100纳秒为单位的时间。
*2.SYSTEMTIME:这个和tm有点类似,代表系统时间。其中,SYSTEMTIME.year的值为多少就表示公元哪一年。
*3.tm:Systemtime-1900得到tm.year,其他的还有些差别 tm.year的值加上1900才表示公元哪一年。
*4.time_t:是日历时间;其值表示从UTC(Coordinated Universal Time)时间1970年1月1日00:00:00(称为UNIX系统的Epoch时间) 到当前时刻的秒数。
FileTime转换为Time_t:
//#### 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);
//将ui.QuadPart的数据类型ULONGLONG强制转换为time_t的LONGLONG数据类型
}
//
注释:公元1601年到公元1970年相差369年,转化为秒数即为11644473600秒。
//********************************************************************/
或是如下方法:
如果编译器中的long类型为4字节时,则 time_t(typedef time_t __int64)和
filetime(filetime结构体中有两个unsigned long类型的变量)占用字节大小一样(__int64是有符号吧),则filetime先可以转化为time_t,再由time_t转化为tm:
__int64 d = *(__int64 *)&st;
//因为filetime结构体中的两个变量是unsigned long类型的,而*(__int64 *)&st只是表示将unsigned long类型的变量st的数据按照__int64(=longlong)来解释读取而已,并未实际将unsigned long类型的变量st的数据转换成__int64(=longlong)数据类型格式的。
__int64 d = *(__int64 *)&st;应该改为__int64 d =(__int64)st;不行,因为编译器一般只存在从基本数据类型到基本数据类型的类型转换函数,而像从复合数据类型到基本数据类型等的类型转换函数一般不存在,即编译器可能不存在从filetime结构体类型到__int64的类型转换函数。
参见: 中的
为什么filetime数据类型的变量st可以通过如下方式正确读取其所要表示的数值:
__int64 d = *(__int64 *)&st?
// or
//__int64 d2;
//memcpy( & d2, & st, sizeof (d2));
(d - 116444736000000000) / 10000000
注释:
CRT中的时间(time_t和tm)
上一篇中介绍了C运行库中的时间处理函数。这一篇介绍Windows SDk中提供的时间函数。两种时间系统之间没有本质区别(事实上CRT时间是用Windows时间实现的,当然这是说的VC实现),同样提供本地时间和UTC时间之间的转换。不过, CRT中的tm时间在SDK中对应为系统时间(SYSTEMTIME),CRT中的time_t时间在SDK中对应的为文件时间(FILETIME),那个"特殊时刻"也变成1601年1月1日的子夜。参见:
FILETIME SYSTEMTIME tm time_t
CRT中的时间(time_t和tm)
FILETIME, SYSTEMTIME 与 time_t 相互转换
filetime 转化为 time_t 百度filetime 时间单位 百度
time_t 时间单位 百度
附加:
补习一下时间单位(http://blog.vckbase.com/zaboli/archive/2005/06/29/8969.aspx)
1ms (毫秒) | 1毫秒=0.001秒=10-3秒(millisecond) |
1μs (微秒) | 1微秒=0.000001=10-6秒(microsecond) |
1ns (纳秒) | 1纳秒=0.000000001秒=10-9秒(nanosecond) |
1ps (皮秒) | 1皮秒=0.000000000001秒=10-12秒 |
1fs (飞秒) | 1飞秒=0.00000000000001秒=10-15秒 |
FILETIME
1功能
2语法
3成员
4要求
FILETIME是一个__int64。可以这样转化成__int64
// or
__int64 d2;
memcpy( & d2, & st, sizeof (d2));
转化为__int64是一个以100纳秒为单位的值