Unix时间戳到LDAP时间戳

时间:2013-04-02 17:53:21

标签: php windows unix time ldap

有很多关于如何转换LDAP-> Unix的例子,但我不能因为上帝的爱将它转换回来,就像在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是否喜欢这个特殊的意思,所以我需要将它存储在一个字符串中,但我不能弄清楚如何计算这些大数字而不是最终得到双倍。

目前我已经:

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

它给了我正确的长度,但它并不是特定的。

我需要什么

简短, Unix-> LDAP时间戳适合Active Directory中的pwdLastSet。 此外,它必须尽可能完美,我的尝试在检查时不会结束:http://www.morecavalier.com/index.php?whom=Apps%2FLDAP+timestamp+converter

Google:自动解决方案(Windows 2012 Active Directory)

您可以在pwdLastSet中简单地声明-1,并且Windows将在密码更改后自动设置上次登录的时间。它并不完美,但它适用于任何谷歌搜索和结束在这里。

3 个答案:

答案 0 :(得分: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条线要反转;它们显然需要以相反的顺序发生,然后使用简单的代数重新排列每个中的术语(/变为*-变为+)我们得到这个:< / p>

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;
}

一些测试表明这很好地颠倒了原作。

答案 1 :(得分:1)

这样的东西?

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

答案 2 :(得分:0)

不要使用intval(),它将在32位PHP上溢出,只需让PHP使用float。

function toLdap($unixTimeStamp) {
    return ($unixTimeStamp + 11644473600) * 10000000;
}

function toUnix($ldapTimeStamp) {
    return (int) (($ldapTimeStamp / 10000000) - 11644473600);
}

您可以使用DateTime(更易理解)来计算Unix和LDAP时间的差异。

$diff = (new DateTime('1970-01-01'))
     ->diff(new DateTime('1601-01-01'))
     ->days * (24 * 60 * 60);

echo $diff; // 11644473600