如何将API返回的TICK_MASK与_Datetime_nano_hundred_ticks转为Python Datetime?
解决方案:转换C#风格的带掩码Tick时间到Python UTC时间
首先,你的两个字段符合C#生态中带掩码的Tick时间特征:
_Datetime_nano_hundred_ticks:单位为100纳秒(和C#DateTime.Ticks定义一致,1 Tick = 100ns),但高位可能包含非时间信息TICK_MASK:位掩码(此处为2^62 - 1),用于提取_Datetime_nano_hundred_ticks中的有效时间位
转换步骤
- 提取有效Tick值:通过位与运算过滤掉非时间的高位信息
- 转换为Python UTC时间:基于C# Tick的起始基准(格里高利历
0001-01-01 00:00:00)与Unix时间戳的差值进行转换
Python代码实现
import datetime # 输入字段 TICK_MASK = 4611686018427387903 _Datetime_nano_hundred_ticks = 5249825230441140085 # 1. 提取有效Tick值 masked_ticks = _Datetime_nano_hundred_ticks & TICK_MASK # 2. 转换参数:C# Tick起始点到Unix纪元的秒数,1秒=10^7个Tick C_EPOCH_TO_UNIX_EPOCH = 62135596800 TICKS_PER_SECOND = 10**7 # 计算Unix时间戳(含微秒级精度) total_seconds = masked_ticks / TICKS_PER_SECOND unix_timestamp = total_seconds - C_EPOCH_TO_UNIX_EPOCH # 转换为UTC datetime对象(保留高粒度时间) utc_datetime = datetime.datetime.fromtimestamp(unix_timestamp, datetime.timezone.utc) print(utc_datetime) # 输出:2023-03-09 01:13:21.375218+00:00
为什么你的原始代码出错?
- 未使用掩码过滤:原始
_Datetime_nano_hundred_ticks包含高位无效数据,直接转换会得到错误的时间值 - 纪元基准差异:C#
DateTime.Ticks的起始点是格里高利历的0001-01-01,而Pythondatetime(1,1,1)默认使用儒略历,两者日期计算规则不同,导致结果偏差
内容的提问来源于stack exchange,提问作者user1234440
相关产品推荐
相关产品推荐

