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

如何将UUID数组转换为时间戳并按降序排序后转回UUID?

UUIDv1数组按时间戳降序排序实现方案

你需要把UUIDv1数组按生成时间倒序排列,以下是具体实现方法:

关键说明

你给出的这些UUID都是UUIDv1版本,这类UUID内置了生成时的时间信息,其他版本的UUID无法提取时间戳,所以这个方案只适用于UUIDv1。

UUIDv1的时间信息分散在三个部分:

  • 第一段(如b35086d0):time_low
  • 第二段(如7de3):time_mid
  • 第三段的后四位(如1ec):time_hi(需要去掉开头的版本标识位1,UUIDv1的版本位固定是1)

我们需要把这些十六进制部分转换成十进制,再结合UUID的时间起始点(1582年10月15日)计算出对应的Unix时间戳。

完整代码

// 提取UUIDv1对应的时间戳(毫秒)
function getUuidTimestamp(uuid) {
  const [timeLowStr, timeMidStr, timeHiVerStr] = uuid.split('-');
  // 转十六进制为十进制
  const timeLow = parseInt(timeLowStr, 16);
  const timeMid = parseInt(timeMidStr, 16);
  // 去掉版本位(前4位),取后12位对应的十六进制值
  const timeHi = parseInt(timeHiVerStr.slice(1), 16);

  // UUID的时间起始点:1582年10月15日(UTC)
  const uuidEpoch = Date.UTC(1582, 9, 15);
  // UUID用100纳秒为单位计数,转换为毫秒要除以10000
  const total100Nanos = (timeHi * 0x100000000) + (timeMid * 0x10000) + timeLow;
  return uuidEpoch + total100Nanos / 10000;
}

// 待排序的UUID数组
const arr = [
  'b35086d0-7de3-11ec-aa3a-f3f0af78e321',
  '668a6d50-7dea-11ec-aa3a-f3f0af78e321',
  'ca189d60-e730-11ec-9306-eb4991e07dcc',
  'e944ab30-e734-11ec-8434-f5c328ae6aaa'
];

// 按时间戳降序排序
const sortedArr = arr.sort((a, b) => getUuidTimestamp(b) - getUuidTimestamp(a));

// 打印结果
console.log(sortedArr);

运行结果

执行后会得到正确的降序排列(最新时间在前):

[
  "e944ab30-e734-11ec-8434-f5c328ae6aaa",
  "ca189d60-e730-11ec-9306-eb4991e07dcc",
  "668a6d50-7dea-11ec-aa3a-f3f0af78e321",
  "b35086d0-7de3-11ec-aa3a-f3f0af78e321"
]

注:你提供的示例输出存在时间逻辑错误,6月8日的UUID生成时间晚于1月25日的,所以正确排序应该是6月的两个在前,再是1月的两个。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.22 22:09:35