21,893
社区成员




//100ns 到 1秒的倍数
$xc = $ysxc = 10000000;
//2的32次方
$two32=2;
$n=32;
for ($i=0;$i<31 ;$i++ )
{
$two32*=2;
}
echo $two32 ."\n";
$sec=$two32/$xc; //2的32次方 处以100ns和1秒的差值
echo $sec ."<br>\n";
$high = 30122779;
$low=1210364416;
//print "$bit << 11 == " . ($bit << 11) . $prod . "\n";
$h=$high*$sec; //高位纳秒转化为秒
echo $h ."<br>\n";
$lowsec=1210364416/$xc; //低位纳秒转化为秒
$tm=$h+$lowsec; //相加就是最终结果秒
echo date('Y-m-d H:i:s',$tm); //不对啊,我晕死了
exit;
//echo 410*86400*365; //12929760000
//高位要 <<32 ,这个表示的是 100ns单位,如果我们只要求秒的单位,那么就可以在<<32中去掉一些位
//计算1601年到2010年,发现秒的数字长度还没有超出php的范围。
$xc = $ysxc = 10000000;
$n=32;
for ($i=32;$i>0 ;$i-- )
{
echo "$xc" ."=$i\n";
$mod+=$xc%2;//2的模只能是0和1
$xc=intval($xc/2);
echo $xc ."=$i=模$mod\n";
}
$bit = 30122779;
print "$bit << 8 == " . ($bit << 11) . $prod . "\n";
$interval=0-strtotime('1601-01-01');//1601的秒数,因为早于1970,因此是个负数,用0减得正数
$time1= (30122779 << 32); //高位
echo $time1 ."<br>\n";
$time1+=1210364416;//高低位合并,得到自1601年以来的"100纳秒"数 = 0.1微秒
$time1/=10;//得到微秒
$time1/=1000;//得到毫秒
$time1/=1000;//得到秒
$d=Date("Y-m-d H:i:s",$time1-$interval);//interval是1601-1970年之间的毫秒数
date_default_timezone_set(PRC);
function turnyear($a,$b){
$count=0;
for($i=$a;$i<$b;$i++)
{
if($i%400==0){
$count++;
continue;
}
if($i%4==0 && $i%100!=0){
$count++;
continue;
}
}
return $count;
}
$ext=(369*365+turnyear(1601,1970))*24*3600/pow(2,32);
$high=(30089218/10000000);
$high=$high-$ext;
$low=(1907785472/10000000);
$time=$high*pow(2,32)+$low;
echo date('Y-m-d H:i:s',$time);