7

Linuxボックスでイントラネットを実行しています。イントラネットは、PHPを介したLDAPを使用して、WindowsボックスのActiveDirectoryに対して認証を行います。

LDAPを使用してADからユーザーのエントリを取得し、php配列から最終ログイン日にアクセスできます。例:

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

これがUnixタイムスタンプの場合、次のPHPコードを使用して、人間が読める形式の日付に変換します。

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

ただし、これは機能しません。誰かが私がこれを達成する方法を知っていますか、または実際にLinuxボックスからそうすることが可能かどうかを知っていますか?

4

2 に答える 2

18

これによると、1601年1月1日以降のWindowsタイムスタンプの数は100 nsです。したがって、次の式を使用してUNIXタイムスタンプに変換できます。

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

1601年1月1日からの秒数に変換するために除算してから、1601年1月から1970年1月までの秒数(UNIX時間)10*1000*1000を割り引きます。11644473600

したがって、PHPでは:

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

編集:興味深いことに、私は馬場とは異なるオフセットを得ました。私は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時間に変換する方法私のオフセットは正しいです。

于 2012-05-02T10:47:17.167 に答える
6

ウィンドウは秒単位ではありませんが、nano secondsそれを で割って切り上げる10000000必要があるため1601-01-01 and 1970-01-01、ウィンドウのタイムスタンプが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)
于 2012-05-02T10:40:29.563 に答える