如何将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
相关产品推荐
相关产品推荐

