116444736000000000的由来
你是不是经常在有关时间的函数代码片段里看到过116444736000000000这个magic number?
下面由我的代码说明这个神奇的magic number:
/* Converting from FILETIME to UNIX Timestamp */
unix_time = FILE_TTIME;
unix_time -= 10000000 * 60 * 60 * 24 * 365 * (1970-1601) + 89; unix_time /= 10000000;
windows有很多关于时间的函数都是使用FILETIME结构,这个结构代表了从1601年1月1日开始到现在的100毫微秒间隔是多少。 而其他平台则更多使用unix时间轴,从1970年1月1日00:00:00到现在的经过的秒数。 当需要转换两个时间戳时,你需要的就是: 116444736000000000 怎么算的?
1s = 1 000 000 000 ns = 10 000 000 * 100 ns //1s内就有10 000 000个100毫微秒间隔。
[10000000s *60 * 60 ] h * 24 * 【365 [days] * (1970-1601)[gap] + 89[leap days 闰年的时间]】 = 116444736000000000ns
在开源项目Wine里,有更好的写法:
#define SECSPERDAY 86400/* 1601 to 1970 is 369 years plus 89 leap days */
#define SECS_1601_TO_1970 ((369 * 365 + 89) * (ULONGLONG)SECSPERDAY)
#define TICKSPERSEC 10000000 //1s内的100毫微秒间隔
#define TICKS_1601_TO_1970 (SECS_1601_TO_1970 * TICKSPERSEC) unix_time = FILE_TTIME;
unix_time -= TICKS_1601_TO_1970;
unix_time /= TICKSPERSEC;