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

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时间的方法,我的偏移是正确的.

  • 我得到了与PHP不同的偏移量:strtotime("1601-01-01") - strtotime("1970-01-01")= 11644470000.这是一小时(3600秒)与您的不同,但正如MSDN所说的那样你的Java派生值我会用你的答案.感谢您的帮助,感谢Baba. (3认同)
  • 我还看到了 11644477200(如 Baba 使用的那样)。那至少是三个不同的值。诚然,差异并不大,在某些情况下可能无关紧要,但最好知道要减去的正确值应该是什么,而不管时区如何。我将使用 `...7360...` 值,如 [在 MSDN 中看到的](http://msdn.microsoft.com/en-us/library/ms724228)。 (2认同)

Bab*_*aba 6

由于 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)