amb*_*ide 6 php timestamp date active-directory
我有一个在Linux机器上运行的Intranet,它使用LDAP通过PHP对Windows机箱上的Active Directory进行身份验证.
我可以使用LDAP从AD检索用户的条目,并从php数组访问最后一个登录日期,例如:
echo $adAccount['lastlogontimestamp'][0]; // returns something like 129802528752492619
Run Code Online (Sandbox Code Playgroud)
如果这是一个Unix时间戳,我会使用以下PHP代码转换为人类可读日期:
date("d-m-Y H:i:s", $lastlogontimestamp);
Run Code Online (Sandbox Code Playgroud)
但是,这不起作用.有谁知道如何实现这一点,或者确实如果可以从Linux机箱中实现这一目标?
bri*_*ium 15
根据这个,你有的窗口时间戳是自1601年1月1日以来的100-ns的数量.因此,您可以使用以下公式将其转换为unix时间戳:
tUnix = tWindow/(10*1000*1000)-11644473600;
Run Code Online (Sandbox Code Playgroud)
你除以10*1000*1000转换为自1601年1月1日以来的秒数,然后折扣11644473600,即1601年1月1日至1970年1月(unix时间)之间的秒数.
所以在PHP中:
date("d-m-Y H:i:s", $lastlogontimestamp/10000000-11644473600);
Run Code Online (Sandbox Code Playgroud)
编辑:有趣的是,我有一个不同于巴巴的偏移.我用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"
Run Code Online (Sandbox Code Playgroud)
根据这个SO:将Unix/Linux时间转换为Windows时间的方法,我的偏移是正确的.
由于 windows 不是以秒为单位,但nano seconds您需要通过将其除以四舍五入,10000000您还需要删除1601-01-01 and 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);
Run Code Online (Sandbox Code Playgroud)
输出
string '30-04-2012 10:47:55' (length=19)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
12137 次 |
| 最近记录: |