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

如何生成始终唯一、可排序且支持格式化的时间戳?

高频率生成唯一可排序时间戳的简洁解决方案

方案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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 11:25:18