NTUSER.dat—自1.1.1601 UTC+以来的100 ns间隔数;0使用PHP
我正在解析Windows注册表NTUSER.dat中的UserAssist文件。从注册表中,我得到一个名为“Last Executed”的字段,该字段的解释是“自1.1.1601 UTC+0以来的100 ns间隔数”。 我的十进制数是131955686641390000,我必须将其转换为人类可读的格式。我想通过使用PHP来实现这一点 我发现有一个函数叫做NTUSER.dat—自1.1.1601 UTC+以来的100 ns间隔数;0使用PHP,php,Php,我正在解析Windows注册表NTUSER.dat中的UserAssist文件。从注册表中,我得到一个名为“Last Executed”的字段,该字段的解释是“自1.1.1601 UTC+0以来的100 ns间隔数”。 我的十进制数是131955686641390000,我必须将其转换为人类可读的格式。我想通过使用PHP来实现这一点 我发现有一个函数叫做add(newdateinterval('XXXX')我想我可以使用它,但我需要一些帮助来确定函数的输入应该是什么。手册在这里 这是我的代码:
add(newdateinterval('XXXX')代码>我想我可以使用它,但我需要一些帮助来确定函数的输入应该是什么。手册在这里
这是我的代码:
$nanoseconds = "131955686641390000";
$date = new DateTime('1601-01-01');
for($i=0;$i<100;$i++) {
$date->add(new DateInterval('P1s'));
}
$date_print = $date->format('Y-m-d H:i:s');
echo"
<p><b>Date:</b> $date_print</p>
";
$nanoseconds=“131955686641390000”;
$date=新的日期时间('1601-01-01');
对于($i=0;$iadd(新日期间隔('P1s'));
}
$date_print=$date->format('Y-m-dh:i:s');
回声“
日期:$Date\u打印
";
我试过了,但失败了:
$nanoseconds = "131955686641390000";
$seconds = $nanoseconds/1000000000;
$add = "PT" . $seconds . "S";
$date = new DateTime('1601-01-01');
for($i=0;$i<100;$i++) {
$date->add(new DateInterval($add));
}
$date_print = $date->format('Y-m-d H:i:s');
echo"
<p><b>Date:</b> $date_print</p>
";
$nanoseconds=“131955686641390000”;
$seconds=$nanoseconds/100000000;
$add=“PT”$seconds.S;
$date=新的日期时间('1601-01-01');
对于($i=0;$iadd(新日期间隔($add));
}
$date_print=$date->format('Y-m-dh:i:s');
回声“
日期:$Date\u打印
";
致命错误:未捕获异常:日期间隔::\构造():未知
或中的错误格式(PT131955686.64139S)
C:\Users\user\wamp64\www\x.php:257
DateInterval->uu构造('PT131955686.641…')#1{main}被抛出
Unix历元时间是自1970年1月1日以来的秒数。它由十位数字组成
你的数字是以几百纳秒为单位的,所以计算出来是11位数
因此,您可以去掉前11位之后的所有内容,并将其传递到从1601年开始的DateTime
,如下所示:
<?php
$nano = '131955686641390000';
$seconds = substr($nano, 0, 11);
$date = new DateTime('1601-01-01');
$date->modify('+' . $seconds . ' seconds');
echo $date->format('Y-m-d H:i:s');
在我看来,这是一个更短更干净的数字。看起来-116444474772
是一个需要记住的有用数字!你的平台是64位的吗?因为这个数字对于32位系统来说太大了。是的,我运行的是64位的Windows 10。这是微软时间,所以它从1601-01-01开始。答案应该是2019年。我刚刚注意到了?微软时间?1601年?!对吗?:-P如果你给出确切的开始日期,我们应该能够计算出确切的开始日期是1601年1月1日。然后我需要添加100 ns间隔,这就是为什么我有100次循环的原因。明白了!更新答案
<?php
$nano = '131955686641390000';
$seconds = ((int) substr($nano, 0, 11)) -11644474772;
$date = new DateTime('@' . $seconds);
echo $date->format('Y-m-d H:i:s');