首页
社区
课程
招聘
[求助]十六进制日期的表示方法
发表于: 2017-5-17 16:33 6525

[求助]十六进制日期的表示方法

2017-5-17 16:33
6525
十六进制的B1 22 或者是22 B1是如何表示2017-05-17这个日期的?求大神指定下算法


[培训]内核驱动高级班,冲击BAT一流互联网大厂工作,每周日13:00-18:00直播授课

收藏
免费 0
支持
分享
最新回复 (2)
雪    币: 222
活跃值: (15)
能力值: ( 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)
 * 7fdK9s2c8@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之类的计算的,照葫芦画瓢即可:9f9K9s2c8@1M7s2y4Q4x3@1q4Q4x3V1k6Q4x3V1k6E0M7$3c8F1i4K6u0W2L8h3W2U0M7X3!0K6L8$3k6@1i4K6u0W2j5$3!0E0i4K6u0r3k6h3&6Q4x3X3c8#2M7#2)9J5c8X3I4A6j5Y4u0S2M7Y4W2Q4x3V1k6E0M7K6M7J5y4o6t1@1y4#2)9J5k6h3q4K6M7s2R3`.

2017-5-17 20:05
0
雪    币: 7
活跃值: (10)
能力值: ( LV2,RANK:10 )
在线值:
发帖
回帖
粉丝
3
geoh 你的这个日期是DOS时间的一个变种,从2000开始计算时间,DOS时间本来是1980开始计算的。int&nbsp;todos(int&nbsp;y,&nbsp;int& ...
十分感谢!
2017-5-18 08:09
0
游客
登录 | 注册 方可回帖
返回