Преобразование метки времени 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)