Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Linux设备上使用PHP将Windows时间戳转换为日期_Php_Date_Active Directory_Timestamp - Fatal编程技术网

在Linux设备上使用PHP将Windows时间戳转换为日期

在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:

我有一个运行在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: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是的,整个日期的事情都是一团糟。它始终取决于您使用的系统。