2013-04-02 361 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