You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将LDAP时间格式/Active Directory时间戳转换为JavaScript日期格式?

这个问题我刚好处理过,其实核心就是理清两种时间戳的差异,然后做单位和起始点的转换就行,我给你详细说下:

首先得明确两种时间戳的核心区别:

  • AD的18位时间戳:从1601年1月1日UTC开始,以100纳秒为单位计数
  • JavaScript的时间戳:从1970年1月1日UTC开始,以毫秒为单位计数

转换的关键就是把AD时间戳转换成毫秒维度,再减去1601到1970之间的固定时间差,就能得到JS可识别的时间戳了。

具体转换函数实现

这里要特别注意一个坑:18位数字已经超过了JavaScript中Number类型的安全整数范围(2^53-1≈9e15),直接用Number处理会丢失精度,所以必须用BigInt来处理:

function convertADTimestampToJSDate(adTimestamp) {
  // 先校验格式:必须是18位数字
  if (!/^\d{18}$/.test(adTimestamp)) {
    throw new Error("无效的AD时间戳,需要是18位数字格式");
  }

  // 转换为BigInt避免精度丢失
  const adTs = BigInt(adTimestamp);
  // 1601年到1970年的固定毫秒差:11644473600000
  const epochDifference = 11644473600000n;
  // AD时间戳转毫秒:100纳秒 = 0.0001毫秒,所以除以10000
  const jsTimestamp = (adTs / 10000n) - epochDifference;

  // 转换为Number并创建Date对象
  const validJsTimestamp = Number(jsTimestamp);
  if (isNaN(validJsTimestamp)) {
    throw new Error("转换后的时间戳无效");
  }

  return new Date(validJsTimestamp);
}

日期比较示例

转换得到Date对象后,就可以和JavaScript中创建的其他日期直接用比较运算符(>、<、===)对比了:

// 从AD获取的时间戳
const adTimestamp = "132614592000000000";
// 转换为JS Date对象
const adDate = convertADTimestampToJSDate(adTimestamp);

// 你自己创建的对比日期
const comparisonDate = new Date("2021-01-15T00:00:00Z");

// 进行比较
if (adDate > comparisonDate) {
  console.log("AD中的时间在对比日期之后");
} else if (adDate < comparisonDate) {
  console.log("AD中的时间在对比日期之前");
} else {
  console.log("两个时间完全相同");
}

额外注意事项

  • 如果你的AD时间戳是以数字形式传入(而非字符串),要确保它没有因为精度丢失被截断,最好提前转成字符串再处理
  • 转换后的Date对象可以使用JS自带的所有日期方法(比如toISOString()、getFullYear()等)来格式化或提取信息

内容的提问来源于stack exchange,提问作者Kinaeh

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 08:00:50