Преобразование метки времени Windows в дату с помощью PHP в Linux

у меня есть интрасеть, работающая на коробке linux, которая аутентифицируется против Active Directory на коробке Windows, используя LDAP через PHP.

Я могу получить запись пользователя из AD с помощью LDAP и получить доступ к последней дате входа в систему из массива php, например:

echo $adAccount['lastlogontimestamp'][0]; // returns something like 129802528752492619

Если бы это была метка времени Unix, я бы использовал следующий PHP-код для преобразования в читаемую человеком дату:

date("d-m-Y H:i:s", $lastlogontimestamp);

однако, это не работает. Кто-нибудь знает, как я могу этого достичь или действительно если это возможно сделать из Linux?

2 ответов


по данным этой, метка времени windows у вас есть количество 100-ns с 1 января 1601 года. Поэтому вы можете просто преобразовать его в метку времени unix, используя следующую формулу:

tUnix = tWindow/(10*1000*1000)-11644473600;

поделить на 10*1000*1000 конвертировать в секунды с 1 января 1601 года, а затем вы скидка 11644473600 это количество секунд между янв 1601 и янв 1970 (время unix).

так в PHP:

date("d-m-Y H:i:s", $lastlogontimestamp/10000000-11644473600);

EDIT: интересно, что я получил другое смещение, чем у бабы. Я получил свой С 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"

согласно этому так:способы преобразования времени 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);

выход

string '30-04-2012 10:47:55' (length=19)