有很多关于如何转换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
您可以在pwdLastSet中简单地声明-1,并且Windows将在密码更改后自动设置上次登录的时间。它并不完美,但它适用于任何谷歌搜索和结束在这里。
答案 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