Intereting Posts
есть что-то вроде isset php в javascript / jQuery? php echo, если выполняются два условия как делить строку, хранящуюся в базе данных myadmin, и искать слово из этой строки в любой последовательности? Не удается передать экземпляр класса в конструктор Добавление месяцев в DateTime с DateInterval изменяет исходную дату для соответствия новой дате добавление параметров к переопределенному методу E_STRICT Помогите мне улучшить рабочий процесс непрерывного развертывания Пользовательские продукты в Drupal или OSCommerce? ReCaptcha 2.0: включить кнопку «Отправить» при обратном вызове, если recaptcha успешно Как использовать str_replace для замены одиночных и двойных кавычек Laravel – уничтожить существующие сеансы при входе в систему CodeIgniter URL-адрес суффикса .html автоматически для всех URL-адресов Magento addFieldToFilter: два поля, совпадающие с OR, а не AND FACEBOOK GRAPH / rest api: как подключить мой СОБСТВЕННЫЙ ПОЛЬЗОВАТЕЛЬ, чтобы обновить мое ПОЛОЖЕНИЕ с PHP Ошибка 1064 с помощью CodeIgniter в таблице ci_sessions

Конвертировать временную метку Windows на сегодняшний день с помощью PHP на Linux-боксе

У меня есть интрасеть, работающая в ящике 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)