【问题标题】:Getting a datetime in this format and converting to hex in python以这种格式获取日期时间并在 python 中转换为十六进制
【发布时间】:2021-07-11 10:07:37
【问题描述】:

我有以下代码:

import datetime

time_stamp = datetime.datetime.utcnow()
print(time_stamp)

这将返回以下内容:

2021-04-16 11:06:16.867390

我想将整个时间戳,包括微秒(即所有 6 个小数位)转换为唯一的十六进制数字。我该怎么做(如果存在的话,最好在一行上)?

类似的解决方案在这里:Getting a datetime in this format and converting to 4 byte hex。但是,它们不包括 utcnow() 返回函数的小数部分,这在这种情况下很重要,因为预计会为每个微秒的变化创建一个不同的十六进制。

【问题讨论】:

  • 你想在这里解决什么问题?将日期时间转换为小于字符串表示的数字表示?

标签: python python-3.x datetime timestamp hex


【解决方案1】:

如果您不介意多花几个字节,那么使用 ISO 8601 格式的字符串是一个不错的选择,因为它易于阅读并清楚如何解释:

# encode datetime:
bts = bytes(dtobj.isoformat(timespec='microseconds'), 'ASCII') # 32 bytes

# decode datetime:
print(datetime.fromisoformat(bts.decode('ASCII')))
# 2020-01-01 00:00:00+00:00

您也可以改用 Unix 时间(如您链接的问题中所示),它只需要 8 个字节:

from datetime import datetime, timezone
import struct

dtobj = datetime(2020,1,1,tzinfo=timezone.utc)

# to seconds since the epoch / unix time (float)
ts = dtobj.timestamp()

# 64bit float to bytes
bts = struct.pack('!d', ts)

# hex repr
print(' '.join(f"x{b:02X}" for b  in bts))
# x41 xD7 x82 xF8 x40 x00 x00 x00

# unpack and back to datetime obj
print(datetime.fromtimestamp(struct.unpack('!d', bts)[0], timezone.utc))
# 2020-01-01 00:00:00+00:00

旁注:don't use utcnow 使用此方法。

【讨论】:

    【解决方案2】:

    这似乎是一种解决方案:

    import datetime
    
    time_stamp = datetime.datetime.utcnow().strftime('%Y%m%d%H%M%S%f')
    print(time_stamp)
    
    time_stamp_hex = hex(int(time_stamp))
    print(time_stamp_hex)
    

    结果是:

    20210416114300753898 # <- numeric
    0x11879d26067ba17ea  # <- hex
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-09-29
      • 1970-01-01
      • 1970-01-01
      • 2017-12-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多