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

Kin*_*aeh 2 javascript ldap date 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)形式的日期数字。

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

Rob*_*obG 8

基于这里*的问题,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();
}
Run Code Online (Sandbox Code Playgroud)
<input placeholder="LDAP time value" id="ldap">
<button onclick="doConversion()">Convert</button>
<br>
<span id="dateString"></span>
Run Code Online (Sandbox Code Playgroud)

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

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

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