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



我正在尝试将UTC时间戳转换为简单的二进制编码消息。想实现示例中提到的内容。

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上看到的输出是'xf4x02x82xa1Exfbxb7C',但是,按照共享链接中的示例,预期是007420bf8838fb17

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。该值显然具有次秒数量,源DateTime没有。

解码引用答案的秒数:

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 Epoch(1970年1月1日午夜(以来的64位纳秒数量,那么我认为您的示例代码只有一个错误:使用格式<q(或<Q(而不是d,并且您会根据需要获得一个小的64位整数。您还需要将timestamp转换为整数以使struct.pack()接受它。

最新更新