我正在尝试将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的子组件,并且该示例具有误导性。 如果<q
(或<Q
(而不是d
,并且您会根据需要获得一个小的64位整数。您还需要将timestamp
转换为整数以使struct.pack()
接受它。