如何将LDAP时间格式转换为JS日期格式?

5
我想从Active Directory中读取时间戳,并将其与JS中创建的另一个日期进行比较。从AD中获取的日期以18位数字的形式表示(自1601年1月1日UTC起100纳秒的时间)。JavaScript使用13位数字的日期数值表示(自1970年1月1日UTC起的毫秒时间)。
是否已经实现了转换函数,或者你如何进行转换?

谢谢你,@FredG,这确实帮了我很多。 - Kinaeh
1个回答

16
根据这个问题,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对象

以上步骤可以组合成单个表达式:

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>

使用LDAP、Active Directory和Filetime时间戳转换器可以生成并将LDAP时间戳转换为日期字符串。

* 如何将LDAP时间戳转换为Unix时间戳

您甚至可以向内置的Date对象添加一个静态的fromLDAPTV方法:

// 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'));


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接