关于如何转换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将自动设置最后一次登录的时间。它不是完美的,但它适用于任何人谷歌并结束在这里。
发布于 2013-04-03 02:11:44
您可以通过正确命名输入参数并在返回前分配一个中间变量来使函数更具可读性。因为$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;
}我们现在有两行代码要反转;它们显然需要以相反的顺序发生,然后使用简单的代数重新排列每一行中的项(/变成*,-变成+),我们得到这样的结果:
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;
}一些测试表明,这很好地颠倒了原始的内容。
发布于 2019-06-05 14:51:47
不要使用intval(),它会在32位的PHP上溢出,让PHP使用浮动即可。
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发布于 2013-04-03 02:12:17
像这样的东西?
function UnixToLDAP($t) {
$AD2Unix = ( (1970-1601) * 365 -3 + round((1970-1601)/4) ) * 86400;
return intval($t+$AD2Unix) * 100000000;
}https://stackoverflow.com/questions/15770879
复制相似问题