【问题标题】:Unix timestamp to LDAP timestampUnix 时间戳到 LDAP 时间戳
【发布时间】:2013-04-02 17:53:21
【问题描述】:

有很多关于如何转换 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 将自动将时间设置为密码更改后的最后一次登录。它并不完美,但它适用于任何使用谷歌搜索并在这里结束的人。

【问题讨论】:

    标签: php windows unix time ldap


    【解决方案1】:

    您可以通过正确命名输入参数并在返回之前分配一个中间变量来使您的函数更具可读性。由于$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;
    }
    

    一些测试表明这很好地反转了原来的内容。

    【讨论】:

    • 是的,我的语法在这个上很不合适。我一直很懒惰,只是从互联网上按原样写作,因为开发笔记本电脑与世界隔离(没有互联网、USB 等),而且我有另一台带有谷歌搜索结果的计算机,所以我输入“sideways”和复制粘贴整个 shabang 并稍后修复它会更容易 :) thx 的通知 :) 您的解决方案有效!
    • 好吧,我在粘贴到可以测试的环境之前对所有这些“盲目”进行了编码;整理只是为了让我看看数学是如何运作的。奇怪的是,根据您链接到的 JS 解决方案,我似乎得到了一个太多的零,但我不明白为什么。
    • 奇怪,您的解决方案解决了 PHP 的浮点问题,这很麻烦! :)
    • 注意:我已经尝试过这个解决方案,它有效,但如果是闰年,您需要将 86400 添加到 $AD2Unix var。
    【解决方案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
    

    【讨论】:

      【解决方案3】:

      这样的?

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

      【讨论】:

      • 而且您的解决方案也有效,有什么方法可以不破坏 PHP 用大量数字完全搞砸的浮点细节? :)
      • 不使用 intval() 是后来的解决方案
      猜你喜欢
      • 2013-03-23
      • 1970-01-01
      • 2021-02-12
      • 2013-03-11
      • 2011-11-26
      • 2010-10-02
      • 2012-03-10
      • 1970-01-01
      • 2013-06-03
      相关资源
      最近更新 更多