如何生成始终唯一、可排序且支持格式化的时间戳?
高频率生成唯一可排序时间戳的简洁解决方案
方案1:结合datetime与time.perf_counter()
利用time.perf_counter()的纳秒级精度补充datetime.now()的精度不足,生成的时间戳天然唯一、可排序,且支持标准格式化:
import datetime import time def get_unique_timestamp(): base_dt = datetime.datetime.now() # 提取perf_counter的小数部分,获取高精度偏移 perf_fraction = time.perf_counter() - int(time.perf_counter()) # 将偏移转换为微秒级,叠加到基础时间上 unique_dt = base_dt + datetime.timedelta(microseconds=perf_fraction * 1e6) return unique_dt # 格式化输出示例 ts = get_unique_timestamp() print("{:%Y-%m-%d %H:%M:%S.%f}".format(ts))
短时间内多次调用也不会重复,排序时直接按datetime对象比较即可。
方案2:基于uuid.uuid1提取时间信息
uuid.uuid1包含精确到100纳秒的时间戳和机器标识,天生唯一且可排序,可转换为标准datetime对象:
import uuid import datetime def get_sortable_unique_timestamp(): u = uuid.uuid1() # 将uuid1的时间字段转换为Unix时间戳 timestamp = (u.time - 0x01b21dd213814000) / 1e7 return datetime.datetime.fromtimestamp(timestamp) # 格式化输出示例 ts = get_sortable_unique_timestamp() print("{:%Y-%m-%d %H:%M:%S.%f}".format(ts))
无需维护额外状态,适合无状态场景。
方案3:封装单例计数器的简化版
如果偏好datetime+计数器的思路,可将计数逻辑封装为单例类,避免全局维护的复杂度:
import datetime class TimestampGenerator: _instance = None _counter = 0 def __new__(cls): if cls._instance is None: cls._instance = super().__new__(cls) return cls._instance def get_timestamp(self): base_dt = datetime.datetime.now() # 通过微秒偏移保证唯一性,计数器循环避免溢出 unique_dt = base_dt + datetime.timedelta(microseconds=self._counter) self._counter = (self._counter + 1) % 1000000 return unique_dt # 使用方式 generator = TimestampGenerator() ts = generator.get_timestamp() print("{:%Y-%m-%d %H:%M:%S.%f}".format(ts))
计数逻辑集中管理,无需修改原有静态函数,代码侵入性低。
选择建议
- 无状态场景优先选方案1或2,无需维护额外变量;
- 需严格保证调用顺序排序的场景选方案3。
内容的提问来源于stack exchange,提问作者petrak.dan
相关产品推荐
相关产品推荐

