2012-05-02 10 views
5

Linuxボックスでイントラネットを実行しています。これはWindowsボックスでActive Directoryに対して認証し、PHPからLDAPを使用します。私は、LDAPを使用してADからユーザーのエントリを検索し、PHPの配列などから、最後にログインした日時にアクセスすることができますLinuxボックスでPHPを使用してWindowsタイムスタンプに変換する

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

これはUnixタイムスタンプだった場合、私はに変換するには、次のPHPコードを使用します人間が判読可能な日付:

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

ただし、これは機能しません。誰もがこれを達成する方法を知っていますか、Linuxボックスからそうすることが可能かどうかは本当ですか?窓以来

答えて

10

thisによれば、そこにあるウィンドウのタイムスタンプは、1601年1月1日以降の100-nsの数です。したがって、あなたはuniに変換できます以下の式を用いてXのタイムスタンプ:1601年1月と1970年1月(UNIX時間)の間の秒数である

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

あなたは月の第1回1601年以来秒に変換するために、10*1000*1000で除算して、あなたは11644473600を割り引きます。 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" 

このSOによると:Ways to Convert Unix/Linux time to Windows time私の正しいオフセットです。

+3

strtotime( "1601-01-01") - strtotime( "1970-01-01")= 11644470000。これはあなたとは異なる1時間(3600秒)ですが、 MSDNはあなたのJava派生値を使用するように言いますあなたの答えを使用します。ご協力いただきありがとうございます。馬場にありがとうございます。 – amburnside

+1

私は11644477200(馬場が使用したとき)も見たことがあります。それは少なくとも3つの異なる値です。確かに、違いは巨大ではなく、状況によっては問題にならないかもしれませんが、差し引くべき正しい値がタイムゾーンに関係なくあるべきであることを知っておくと良いでしょう。私は '[MSDNで見たように]' ... 7360 ... 'の値を使うつもりです(http://msdn.microsoft.com/en-us/library/ms724228)。 – Synetech

+0

@Synetechええ、全体の日付ものは血まみれの混乱です。それは常に使用しているシステムによって異なります。 – brimborium

3

は秒単位ではなく、nano secondsに、あなたは10000000割ることによって、それを切り上げるあなたも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); 

出力から窓のタイムスタンプの開始以来、1601-01-01 and 1970-01-01間の秒を削除する必要がある必要がある

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

あなたの機能が何をしているのか説明できますか?つまり、なぜ10millionで割り、11644477200を引くのですか? – amburnside

+0

exaplanationが追加されました – Baba

関連する問題