我正在尝试将UTC时间戳转换为简单的二进制编码消息。 希望实现示例here中提到的内容。
Binary Encoding Example
The following timestamp:
UTC timestamp 14:17:22 Friday, October 4, 2024
is expressed in binary code (nanoseconds since Unix epoch) this way:
007420bf8838fb17 (8 bytes in nanoseconds since Unix epoch synced to a master clock to microsecond accuracy.
到目前为止,我所做的是,
import struct
from datetime import datetime
dt = datetime(2024, 10, 4, 14, 17, 22, 0)
timestamp = (dt - datetime(1970, 1, 1)).total_seconds() * 1000000000
utc_timestamp = struct.pack('d', timestamp)
我在CLI上看到的输出是'\xf4\x02\x82\xa1E\xfb\xb7C'
但是,根据共享链接中的示例,预期为007420bf8838fb17
答案 0 :(得分:0)
TL; DR:我认为链接示例中存在错误,或者表示的描述不正确或不完整。
import struct
from datetime import datetime, timedelta, timezone
utc_tz = timezone(timedelta(0))
t = datetime(2024, 10, 4, 14, 17, 22, 0, utc_tz)
nanos = int(t.timestamp()) * 1_000_000_000
print(hex(timestamp))
这给出了0x17fb45a18202f400
的结果,而不是引用的0x17fb3888bf297400
(如所示,我认为它是一个小端字节字符串,所以这个值的字节顺序颠倒了。)
引用的答案,转换为十进制秒(除以1_000_000_000)为1728037042.0005898
。该值显然具有亚秒数量,源日期时间不具有。
解码所引用答案的秒组件:
import time
answer = 0x17fb3888bf297400
secs = int(answer / 1_000_000_000)
print(time.gmtime(secs))
给出:
time.struct_time(tm_year=2024, tm_mon=10, tm_mday=4, tm_hour=10, tm_min=17, tm_sec=22, tm_wday=4, tm_yday=278, tm_isdst=0)
看起来几乎正确,除了小时组件提前4小时。所以...我的猜测是这实际上是美国/东部时间戳(不是UTC),并且包含5898ns的亚秒组件,并且该示例具有误导性。
如果您正在使用的架构将时间戳编码为自Unix纪元(1970年1月1日午夜)以来的64位纳秒数,那么我认为您的示例代码只有一个错误:使用格式<q
(或<Q
)而不是d
,您将根据需要获得一个小端64位整数。您还需要将timestamp
转换为整数才能struct.pack()
接受它。