2013-04-02 354 views
2

有很多關於如何LDAP->的Unix轉換的例子,但我不能對上帝的愛將其轉換回在Unix的> LDAP ..Unix時間戳到LDAP時間戳

這裏就是我得趕緊爲LDAP-> Unix的:

How to convert LDAP timestamp to Unix timestamp
http://www.morecavalier.com/index.php?whom=Apps%2FLDAP+timestamp+converter

function LDAPtoUnix($t) { 
    $secsAfterADepoch = $t/(100000000); 
    $AD2Unix = ((1970-1601) * 365 -3 + round((1970-1601)/4)) * 86400; 
    return intval($secsAfterADepoch-$AD2Unix); 
} 

,我認爲應該是準確的。 但我扭曲我小小的腦袋扭轉數學,我不知道它.. 我的頭沸騰,只是計算不同時期之間的差異秒和簡單地加/減他們到給定的時間參數?

有人可以談談如何扭轉時間戳嗎?

參考:http://msdn.microsoft.com/en-us/library/windows/desktop/ms679430(v=vs.85).aspx

而且爲什麼我要問,除了我的大腦不想計算,數學的主要原因是,PHP的浮點機制似乎是不那麼具體,因爲它需要是什麼? 如果我計算Unix-> LDAP時間戳,我會以1.3009518089E+17結束,我不確定Active Directory是否喜歡這個特定的notaion,所以我需要將它存儲在一個字符串中,但我不知道如何計算這些大數字,而不是結束雙。

目前,我已經有了:

printf("%.0f", UnixToLDAP(time())); 

這給了我正確的長度,但它不是真正具體。

我需要什麼

簡短,適合在pwdLastSet在Active Directory Unix的> LDAP時間戳。 此外,它必須儘可能完美,檢查時,我的嘗試並沒有好下場:http://www.morecavalier.com/index.php?whom=Apps%2FLDAP+timestamp+converter

谷歌:自動解決方案(2012的Windows活動目錄)

你可以簡單的狀態-1的pwdLastSet和Windows會在密碼更改後自動將時間設置爲上次登錄的時間。這不是完美的,但它適用於任何使用谷歌搜索和結束在這裏。

回答

3

通過正確命名輸入參數並在返回之前分配一箇中間變量,可以使您的函數更具可讀性。由於$AD2Unix實際上是一個固定的術語,它可能是一個常數;現在,我剛把它移到函數頂部:

function LDAPtoUnix($ldap_ts) { 
    $AD2Unix = ((1970-1601) * 365 -3 + round((1970-1601)/4)) * 86400; 

    $secsAfterADepoch = $ldap_ts/100000000; 
    $unix_ts = intval($secsAfterADepoch - $AD2Unix); 

    return $unix_ts; 
} 

我們現在有2行要反轉;他們顯然需要以相反的順序發生,然後用簡單的代數運算來重新排列在每個方面(/變得*-成爲+),我們得到這樣的:

function UnixtoLDAP($unix_ts) { 
    $AD2Unix = ((1970-1601) * 365 -3 + round((1970-1601)/4)) * 86400; 

    $secsAfterADepoch = intval($AD2Unix + $unix_ts); 
    $ldap_ts = $secsAfterADepoch * 100000000; 

    return $ldap_ts; 
} 

一對夫婦的測試表明這種反轉很好原。

+0

葉普,我的語法在這一點上是相當不合適的。 我一直懶惰,只是寫在網上發現,因爲開發筆記本電腦是從世界隔離(沒有互聯網,USB等),我有另一臺谷歌結果的計算機,所以我打字「側身」只需複製粘貼整個shabang並稍後修復它就更容易了:) thx通知tho :)您的解決方案有效! – Torxed

+0

嗯,我把所有這些「盲目」都編碼在一個可以測試它的環境中,整理只是讓我可以看到數學如何工作。奇怪的是,根據您所鏈接的JS解決方案,我似乎得到了太多的零,但我看不出爲什麼。 – IMSoP

+0

奇怪的是,您的解決方案修復了neet的PHP浮點問題! :) – Torxed

1

這樣的事情?

function UnixToLDAP($t) { 
    $AD2Unix = ((1970-1601) * 365 -3 + round((1970-1601)/4)) * 86400; 
    return intval($t+$AD2Unix) * 100000000; 
} 
+0

你的解決方案也可以,任何方式不會破壞浮點細節PHP f ***完全與大數字? :) – Torxed

+1

不使用intval()是以後的解決方案 – Torxed