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

How to to convert from ldap time format to js date format?

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

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

根据问题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 对象

可以组合成一个表达式:

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 Timestamp Converter.

生成 LDAP 时间戳并将其转换为日期字符串

* How to convert LDAP timestamp to Unix timestamp

您甚至可以向内置日期添加静态 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'));