在Linux设备上使用PHP将Windows时间戳转换为日期
我有一个运行在linux机器上的intranet,它通过PHP使用LDAP对Windows机器上的Active Directory进行身份验证 我可以使用LDAP从AD检索用户条目,并从php数组访问最后登录日期,例如:在Linux设备上使用PHP将Windows时间戳转换为日期,php,date,active-directory,timestamp,Php,Date,Active Directory,Timestamp,我有一个运行在linux机器上的intranet,它通过PHP使用LDAP对Windows机器上的Active Directory进行身份验证 我可以使用LDAP从AD检索用户条目,并从php数组访问最后登录日期,例如: echo $adAccount['lastlogontimestamp'][0]; // returns something like 129802528752492619 如果这是Unix时间戳,我将使用以下PHP代码转换为人类可读的日期: date("d-m-Y H:i:
echo $adAccount['lastlogontimestamp'][0]; // returns something like 129802528752492619
如果这是Unix时间戳,我将使用以下PHP代码转换为人类可读的日期:
date("d-m-Y H:i:s", $lastlogontimestamp);
然而,这是行不通的。有人知道我是如何做到这一点的吗?或者确实有可能从Linux机器上做到这一点吗?因为windows不是以秒为单位的,而是以纳米秒为单位的,你需要将它四舍五入,除以
10000000
,你还需要删除1601-01-01和1970-01-01
,因为windows时间戳从1601-01-01
function convertWindowsTimestamp($wintime) {
return $wintime / 10000000 - 11644477200;
}
$lastlogontimestamp = convertWindowsTimestamp("129802528752492619");
$date = date("d-m-Y H:i:s", $lastlogontimestamp);
var_dump($date);
输出
string '30-04-2012 10:47:55' (length=19)
根据,您拥有的windows时间戳是1601年1月1日以来的100纳秒数。因此,您可以使用以下公式将其转换为unix时间戳:
tUnix = tWindow/(10*1000*1000)-11644473600;
除以10*1000*1000
可转换为1601年1月1日起的秒数,然后再贴现116444473600
,即1601年1月至1970年1月(unix时间)之间的秒数
因此,在PHP中:
date("d-m-Y H:i:s", $lastlogontimestamp/10000000-11644473600);
编辑:有趣的是,我得到的偏移量与爸爸不同。我用Java得到了我的:
Calendar date1 = Calendar.getInstance(); date1.set(1601, 1, 1);
Calendar date2 = Calendar.getInstance(); date2.set(1970, 1, 1);
long dt = date2.getTimeInMillis() - date1.getTimeInMillis();
System.out.println(String.format("%f", dt / 1000.0)); // prints "11644473600.000000"
根据这一点:我的偏移量是正确的。你能解释一下你的函数在做什么吗,也就是说,为什么要除以1000万然后减去116444477200?我用PHP得到了一个不同的偏移量:strotime(“1601-01-01”)-strotime(“1970-01-01”)=116444470000。这与您的时间相差一小时(3600秒),但正如MSDN所说,要使用Java派生值,我将使用您的答案。谢谢你的帮助,谢谢你对爸爸的帮助。我也看到了116444477200(爸爸用过的)。这至少是三个不同的值。诚然,这种差异不是很大,在某些情况下也可能无关紧要,但是知道要减去的正确值应该是什么,不管时区如何,这是很好的。我将使用
…7360…
值作为。@Synetech是的,整个日期的事情都是一团糟。它始终取决于您使用的系统。