NTUSER.dat—自1.1.1601 UTC+以来的100 ns间隔数;0使用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')我想我可以使用它,但我需要一些帮助来确定函数的输入应该是什么。手册在这里 这是我的代码:

我正在解析Windows注册表NTUSER.dat中的UserAssist文件。从注册表中,我得到一个名为“Last Executed”的字段,该字段的解释是“自1.1.1601 UTC+0以来的100 ns间隔数”。 我的十进制数是131955686641390000,我必须将其转换为人类可读的格式。我想通过使用PHP来实现这一点

我发现有一个函数叫做
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');