Unix时间戳到FAT时间戳

我试图将时间结构转换为FAT时间戳。 我的代码看起来像:

unsigned long Fat(tm_struct pTime) { unsigned long FatTime = 0; FatTime |= (pTime.seconds / 2) >> 1; FatTime |= (pTime.minutes) << 5; FatTime |= (pTime.hours) << 11; FatTime |= (pTime.days) << 16; FatTime |= (pTime.months) << 21; FatTime |= (pTime.years + 20) << 25; return FatTime; } 

有人有正确的代码吗?

 The DOS date/time format is a bitmask: 24 16 8 0 +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ |Y|Y|Y|Y|Y|Y|Y|M| |M|M|M|D|D|D|D|D| |h|h|h|h|h|m|m|m| |m|m|m|s|s|s|s|s| +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ +-+-+-+-+-+-+-+-+ \___________/\________/\_________/ \________/\____________/\_________/ year month day hour minute second The year is stored as an offset from 1980. Seconds are stored in two-second increments. (So if the "second" value is 15, it actually represents 30 seconds.) 

我不知道你正在使用的tm_struct,但如果它是http://www.cplusplus.com/reference/ctime/tm/那么

 unsigned long FatTime = ((pTime.tm_year - 80) << 25) | (pTime.tm_mon << 21) | (pTime.tm_mday << 16) | (pTime.tm_hour << 11) | (pTime.tm_min << 5) | (pTime.tm_sec >> 1); 

Lefteris E给出了几乎正确的答案,但这里有一点错误

你应该添加1到tm_mon,因为tm struct将月份作为数字从0到11( struct tm ),但DOS日期/时间从1到12( FileTimeToDosDateTime )。 这是正确的

 unsigned long FatTime = ((pTime.tm_year - 80) << 25) | ((pTime.tm_mon+1) << 21) | (pTime.tm_mday << 16) | (pTime.tm_hour << 11) | (pTime.tm_min << 5) | (pTime.tm_sec >> 1);