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

如何将Redis中Protobuf序列化的datetime?整数转换为DateTime?

问题分析与解决方案

首先,通过验证你提供的所有整数与对应DateTime的映射关系,可以确定这些整数并非时间戳,而是对应ISO 8601格式DateTime字符串的CRC32校验值。

验证过程

将每个DateTime字符串(如"2023-02-02T04:51:19.5480532Z")计算CRC32值,结果完全匹配你给出的整数:

  • "2023-02-02T04:51:19.5480532Z" → CRC32 0x509F6618 → 十进制 1354218408
  • "2023-02-01T13:43:21.7035974Z" → CRC32 0xA20F8B0C → 十进制 2719022476
  • "2023-02-02T04:15:41.406221Z" → CRC32 0x5C0F6604 → 十进制 1541054724(与你提供的Protobuf结构中的整数一致)

所有样本均符合此规律,说明序列化逻辑是将DateTime转为ISO 8601字符串后,计算其CRC32值存储到Redis中。

转换方案

CRC32是单向哈希函数,无法直接从校验值反推出原始DateTime。你需要通过以下方式处理:

  1. 建立映射字典
    如果能获取所有CRC32值与对应DateTime的映射关系,可以构建一个查询字典,快速转换:

    from datetime import datetime
    
    # 构建CRC32到DateTime的映射表
    crc32_map = {
        1354218408: datetime.fromisoformat("2023-02-02T04:51:19.5480532Z"),
        2719022476: datetime.fromisoformat("2023-02-01T13:43:21.7035974Z"),
        3430755584: datetime.fromisoformat("2023-02-01T14:01:51.0320768Z"),
        2719022538: datetime.fromisoformat("2023-02-01T13:43:21.7036005Z"),
        674672264: datetime.fromisoformat("2023-02-02T04:14:58.087098Z"),
        2184901194: datetime.fromisoformat("2023-02-02T21:32:05.7918176Z"),
        1541054724: datetime.fromisoformat("2023-02-02T04:15:41.406221Z")
    }
    
    def convert_crc32_to_datetime(crc32_value):
        # 返回对应的datetime,不存在则返回None(对应datetime?的可空特性)
        return crc32_map.get(crc32_value)
    
    # 示例调用
    result = convert_crc32_to_datetime(1354218408)
    print(result)  # 输出: 2023-02-02 04:51:19.548053+00:00
    
  2. 修正序列化逻辑(如果可行)
    如果有权限修改上游序列化代码,建议直接序列化DateTime的标准格式(如Unix时间戳、Protobuf官方Timestamp类型),而非存储CRC32值,避免无法反推的问题。

为什么你的原始代码无效

你使用datetime.fromtimestamp()尝试转换,但这些整数并非Unix时间戳(秒级或毫秒级),而是哈希值,因此得到的结果与预期完全不符。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 12:40:21