如何从ldap时间格式转换为js日期格式?

时间:2018-01-12 10:18:55

标签: javascript date ldap date-conversion

我想从Active Directory中读取时间戳,并将其与JS中创建的其他日期进行比较。 从AD我得到一个18位数字(time in 100 nanoseconds since Jan 1, 1601 UTC)形式的日期。 JavaScript使用13位数字(time in miliseconds since Jan 1, 1970 UTC)形式的日期编号。

是否已经实施了转换功能或者您将如何转换它?

1 个答案:

答案 0 :(得分:2)

根据问题here *,1.29265206716E + 17代表2010-08-17T12:11:11Z,以便可以用作测试值。 LDAP时间值以0.0000001秒为单位,而ECMAScript使用0.001秒。

所以步骤是:

  1. 将LDAP时间值转换为毫秒(除以1e4)
  2. 获取1601-01-01和1970-01-01之间的时差(以毫秒为单位)
  3. 减去差异
  4. 传递给Date构造函数以创建Date对象
  5. 可以组合成单个表达式:

    
    
    function ldapToJS(n) {
    
      // Longer, equivalent to short version
      // return new Date(n/1e4 + new Date(Date.UTC(1601,0,1)).getTime());
    
      // Shorter, more efficient. Uses time value for 1601-01-01 UTC
      return new Date(n/1e4 - 1.16444736e13);
    }
    
    console.log(ldapToJS(1.29265206716E+17).toISOString()); // 2010-08-17T02:11:11.600Z
    console.log(ldapToJS(1.3160237812e17).toISOString());   // 2018-01-12T13:36:52.000Z
    
    function doConversion(){
      document.getElementById('dateString').textContent = ldapToJS(+document.getElementById('ldap').value).toISOString();
    }
    
    <input placeholder="LDAP time value" id="ldap">
    <button onclick="doConversion()">Convert</button>
    <br>
    <span id="dateString"></span>
    &#13;
    &#13;
    &#13;

    可以生成LDAP时间戳并将其转换为LDAP, Active Directory & Filetime Timestamp Converter的日期字符串。

    * How to convert LDAP timestamp to Unix timestamp

    您甚至可以将静态 fromLDAPTV 方法添加到内置日期:

    &#13;
    &#13;
    // Convert LDAP time value to Date
    if (!Date.fromLDAPTV) {
      Date.fromLDAPTV = function (n) {
        return new Date(n/1e4 - 1.16444736e13);
      }
    }
    
    console.log(Date.fromLDAPTV(131602386750000000))
    
    // Convert LDAP string to date (only timezone Z)
    if (!Date.fromLDAPString) {
      Date.fromLDAPString = function (s) {
        var b = s.match(/\d\d/g);
        return new Date(Date.UTC(b[0]+b[1], b[2]-1, b[3], b[4], b[5], b[6]));
      }
    }
    
    console.log(Date.fromLDAPString('20180112232359Z'));
    &#13;
    &#13;
    &#13;