■ Top ■ CoC ■ Tips ■ Tools ■ Links

Active Directoryにおける日時情報
シェア
Description
ActiveDirectoryからLDAPで以下の日時情報を取得すると、
PHPのdate()関数などで変換しても正しい日時が取得できません。
  • 最終ログイン日時(lastlogon)
  • パスワード変更日時(pwdlastset)
  • 有効期限(accountexpires)
取得した日時を正しく変換する方法を紹介します。
Solution
LDAPで取得した日時情報は、1601/01/01 00:00:00からの
経過時間を100ナノ秒単位で表して返ってきます。(WindowsのFILETIME)

一方、PHPのmktime()関数で作成するタイムスタンプは
1970/01/01 00:00:00からの経過で返ってきます。(Unix Time)

つまり、単位を揃えてこのオフセットを取り除けば
正しい時間を得ることができます。
$offset = 1970 - 1601            // 経過年
$offset = $offset * 365          // 日へ換算
$offset = $offset + 89           // 閏年を加算(1601年~1970年で89回)
$offset = $offset * 24 * 60 * 60 // 秒へ換算
↓
$offset: 11644473600
従って、取得した日時を$valueとするなら、
PHPであれば以下の1行で変換可能となります。
date("Y/m/d H:i:s", ceil($value / 10000000) - 11644473600);

【楽天で購入】
When Unavailable
一度もログインしたことが無いアカウントなど、日付データが存在しない場合、
0もしくは0x7FFFFFFFFFFFFFFFが返ってきます。
日付変換関数を作成する際はこの2つのパラメータを無視すればOKです。