У меня есть интрасеть, работающая в ящике linux, которая аутентифицируется в Active Directory в окне Windows, используя LDAP через PHP.
Я могу получить запись пользователя из AD с использованием LDAP и получить доступ к последней дате входа из массива php, например:
echo $adAccount['lastlogontimestamp'][0]; // returns something like 129802528752492619
Если бы это была временная метка Unix, я бы использовал следующий код PHP для преобразования в человеко-читаемую дату:
date("dmY H:i:s", $lastlogontimestamp);
Однако это не работает. Кто-нибудь знает, как я могу это достичь, или действительно, если это возможно сделать из ящика Linux?
В соответствии с этим , у вас есть временная метка Windows с номером 100 нс с 1 января 1601 года. Поэтому вы можете просто преобразовать ее в временную метку unix, используя следующую формулу:
tUnix = tWindow/(10*1000*1000)-11644473600;
Вы делите на 10*1000*1000
чтобы конвертировать в секунды с 1 января 1601 года, а затем вы 11644473600
что составляет количество секунд между 11644473600
1601 и 11644473600
1970 года (время unix).
Итак, в PHP:
date("dmY H:i:s", $lastlogontimestamp/10000000-11644473600);
EDIT: Интересно, что у меня другое смещение, чем у Бабы. У меня есть Java с 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"
Согласно этому SO: Способы конвертировать Unix / Linux во время 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("dmY H:i:s", $lastlogontimestamp); var_dump($date);
Вывод
string '30-04-2012 10:47:55' (length=19)