能力值:
( LV2,RANK:10 )
|
-
-
2 楼
你的这个日期是DOS时间的一个变种,从2000开始计算时间,DOS时间本来是1980开始计算的。 int todos(int y, int m, int d) {
y -= 2000;
return y << 9 | m << 5 | d;
}
printf('%x', todos(2017, 5, 17)); 22 b1 我把代码改了以下,从2000开始,这样得到的结果就是正确的。 下面是PHP的实现 /**
* Unix timestamp to DOS datetime(4 bytes)
* 58dK9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6E0M7K6M7J5y4o6t1@1y4#2)9J5k6h3q4K6M7s2R3`.
*
* @param integer $timestamp Unix timestamp
* @return integer DOS datetime for 4 bytes
*/
function timestamp2dos($timestamp)
{
$bit = empty($timestamp) ? getdate() : getdate($timestamp);
if ($bit['year'] < 2000)
return (1 << 21 | 1 << 16);
$bit['year'] -= 2000;
return $bit['year'] << 25 |
$bit['mon'] << 21 |
$bit['mday'] << 16 |
$bit['hours'] << 11 |
$bit['minutes'] << 5 |
$bit['seconds'] >> 1;
}
echo dechex(timestamp2dos(mktime(0, 0, 0, 5, 17, 2017)))
//22 b1 00 00 上面的例子是传入的unix timestamp,但是最终还是用 year、mon、day之类的计算的,照葫芦画瓢即可:196K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6E0M7K6M7J5y4o6t1@1y4#2)9J5k6h3q4K6M7s2R3`.
|
能力值:
( LV2,RANK:10 )
|
-
-
3 楼
geoh
你的这个日期是DOS时间的一个变种,从2000开始计算时间,DOS时间本来是1980开始计算的。int todos(int y, int& ...
十分感谢!
|
|
|