首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Unix时间戳到LDAP时间戳

Unix时间戳到LDAP时间戳
EN

Stack Overflow用户
提问于 2013-04-03 01:53:21
回答 3查看 2.9K关注 0票数 2

关于如何转换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

代码语言:javascript
复制
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是否喜欢这个特殊的数字,所以我需要将它存储在一个字符串中,但我不知道如何计算这些大数字而不是得到一个双精度数。

目前我得到的是:

代码语言:javascript
复制
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将自动设置最后一次登录的时间。它不是完美的,但它适用于任何人谷歌并结束在这里。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-04-03 02:11:44

您可以通过正确命名输入参数并在返回前分配一个中间变量来使函数更具可读性。因为$AD2Unix实际上是一个固定的术语,所以它可能是一个常量;现在,我只是将它移到了函数的顶部:

代码语言:javascript
复制
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;
}

我们现在有两行代码要反转;它们显然需要以相反的顺序发生,然后使用简单的代数重新排列每一行中的项(/变成*-变成+),我们得到这样的结果:

代码语言:javascript
复制
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;
}

一些测试表明,这很好地颠倒了原始的内容。

票数 3
EN

Stack Overflow用户

发布于 2019-06-05 14:51:47

不要使用intval(),它会在32位的PHP上溢出,让PHP使用浮动即可。

代码语言:javascript
复制
function toLdap($unixTimeStamp) {
    return ($unixTimeStamp + 11644473600) * 10000000;
}

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

您可以使用DateTime计算Unix和LDAP时间的差异(可读性更好)。

代码语言:javascript
复制
$diff = (new DateTime('1970-01-01'))
     ->diff(new DateTime('1601-01-01'))
     ->days * (24 * 60 * 60);

echo $diff; // 11644473600
票数 2
EN

Stack Overflow用户

发布于 2013-04-03 02:12:17

像这样的东西?

代码语言:javascript
复制
function UnixToLDAP($t) {
    $AD2Unix = ( (1970-1601) * 365 -3 + round((1970-1601)/4) ) * 86400;
    return intval($t+$AD2Unix) * 100000000;
}
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/15770879

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档