2

有很多关于如何转换 LDAP-> Unix 的例子,但我不能像在 Unix-> LDAP 中那样将它转换回来。

这是我为 LDAP->Unix 准备的:

如何将 LDAP 时间戳转换为 Unix 时间戳
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()));

这给了我正确的长度,但它并不是很具体。

我需要的

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

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

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

4

3 回答 3

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

一些测试表明这很好地反转了原始数据。

于 2013-04-02T18:11:44.447 回答
2

不要使用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
于 2019-06-05T06:51:46.503 回答
1

像这样的东西?

function UnixToLDAP($t) {
    $AD2Unix = ( (1970-1601) * 365 -3 + round((1970-1601)/4) ) * 86400;
    return intval($t+$AD2Unix) * 100000000;
}
于 2013-04-02T18:12:16.860 回答