将UTC时间戳转换为简单二进制编码消息

时间:2018-02-07 05:40:03

标签: python-2.7 encoding datetime-format

我正在尝试将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

1 个答案:

答案 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()接受它。