我正在使用 PHP 脚本使用 LDAP 从 Active Directory 中获取数据。
当我得到“lastlogon”的用户值时,我得到一个像 129937382382715990 这样的数字
我试图弄清楚如何从中获取日期/时间,但不知道,有人可以帮忙吗?
我正在使用 PHP 脚本使用 LDAP 从 Active Directory 中获取数据。
当我得到“lastlogon”的用户值时,我得到一个像 129937382382715990 这样的数字
我试图弄清楚如何从中获取日期/时间,但不知道,有人可以帮忙吗?
在PHP:LDAP 函数页面上阅读此评论。
它们都使用“间隔”日期/时间格式,其值表示自 1601 年 1 月 1 日(UTC,0 或 0x7FFFFFFFFFFFFFFF,9223372036854775807 表示帐户永不过期)以来的 100 纳秒间隔数:https://msdn.microsoft.com/en-us/library/ms675098(v=vs.85).aspx
因此,如果您需要将其从/转换为 UNIX 时间戳,您可以通过以下方式轻松计算差异:
<?php $datetime1 = new DateTime('1601-01-01'); $datetime2 = new DateTime('1970-01-01'); $interval = $datetime1->diff($datetime2); echo ($interval->days * 24 * 60 * 60) . " seconds\n"; ?>
两个日期之间的差异是 11644473600 秒。不要依赖浮点计算或其他可能计算错误的数字(包括时区或类似的东西)。
现在您可以从 LDAP 字段转换:
<?php $lastlogon = $info[$i]['lastlogon'][0]; // divide by 10.000.000 to get seconds from 100-nanosecond intervals $winInterval = round($lastlogon / 10000000); // substract seconds from 1601-01-01 -> 1970-01-01 $unixTimestamp = ($winInterval - 11644473600); // show date/time in local time zone echo date("Y-m-d H:i:s", $unixTimestamp) ."\n"; ?>
这是自 1601 年 1 月 1 日 00:00:00 UT 以来的 100 纳秒滴答数。
维基百科中的系统时间文章可以为您提供更多详细信息。
那这个呢:
$timeStamp = 129937382382715990;
echo date('Y-m-d H:i:s', $timeStamp);
编辑 - - -
我刚刚尝试了以下方法,并注意到除非您机器上的时钟设置在未来 10 年,否则此方法将不起作用。下面是我用来证明上述内容几乎没有用的代码,除非你做更多的处理可能......
$time = time();
echo date('Y-m-d H:i:s', $time);
echo "<br />";
$timeStamp = 129937382382715990;
echo date('Y-m-d H:i:s', $timeStamp);
就我而言,我使用的是 Pentaho。使用 aModified Javascript value
您可以转换值,lastLogon
是我要从数据流转换的列:
calendar = java.util.Calendar.getInstance();
calendar.setTime(new Date("1/1/1601"));
base_1601_time = calendar.getTimeInMillis();
calendar.setTime(new Date("1/1/1970"));
base_1970_time = calendar.getTimeInMillis();
ms_offset = base_1970_time - base_1601_time;
calendar.setTimeInMillis( lastLogon / 10000 - ms_offset); //lastLogon is a column from stream
var converted_AD_time = calendar.getTime(); // now just add this variable 'converted_AD_time' to the 'Fields' as a show in the image below