For The Best Thing In The World

Work Hard to Enjoy Them. bloom energy

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;