如何从UUID v7中提取时间戳?
从UUID v7字符串提取时间戳的方法
根据UUID v7的定义,其前48位是自Unix纪元以来的毫秒级时间戳(大端无符号数),后续4位是固定版本位0111(对应十六进制的7)。提取时间戳的核心是解析这前48位数据,步骤如下:
手动提取步骤
- 移除分隔符:把UUID字符串中的
-全部去掉,得到32位连续的十六进制字符(例如01893877-796f-7000-8123-456789abcdef变为01893877796f70008123456789abcdef)。 - 截取时间戳段:取前12位十六进制字符(每一位十六进制对应4位二进制,12×4=48位,正好匹配定义中的时间戳长度),比如上例中取
01893877796f。 - 转换为十进制毫秒数:将截取的十六进制字符串转为十进制整数,这个数值就是Unix纪元以来的毫秒时间戳。
- 可选:转换为可读时间:把毫秒数除以1000得到秒级时间戳,再转换为具体的日期时间格式。
代码实现(Python)
from datetime import datetime def extract_uuidv7_timestamp(uuid_str): # 移除UUID中的分隔符 hex_raw = uuid_str.replace('-', '') # 校验是否为有效的UUID v7:第13位字符(索引12)必须是版本位'7' if len(hex_raw) != 32 or hex_raw[12] != '7': raise ValueError("输入不是有效的UUID v7格式") # 截取前12位十六进制字符(对应48位时间戳) timestamp_hex = hex_raw[:12] # 转换为毫秒级时间戳 timestamp_ms = int(timestamp_hex, 16) # 转换为可读的datetime对象 dt = datetime.fromtimestamp(timestamp_ms / 1000.0) return timestamp_ms, dt # 示例使用 sample_uuid_v7 = "01893877-796f-7000-8123-456789abcdef" ms_ts, readable_time = extract_uuidv7_timestamp(sample_uuid_v7) print(f"毫秒时间戳: {ms_ts}") print(f"对应时间: {readable_time}")
关键说明
- UUID v7的版本位固定为十六进制
7,提取前可以先校验这一点,避免处理非v7的UUID。 - 因为时间戳是大端存储,十六进制字符串的顺序直接对应时间戳的高位到低位,无需反转字节顺序。
内容的提问来源于stack exchange,提问作者Gajus
相关产品推荐
相关产品推荐

