darren
darren

Reputation: 5734

Getting a datetime in this format and converting to hex in python

I have the following code:

import datetime

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

This returns the following:

2021-04-16 11:06:16.867390

I would like to convert the entire timestamp, including the microseconds (ie. all 6 decimal places) to a unique hex number. How can i do this (preferably on one line if it exists) ?

Similar solutions are here: Getting a datetime in this format and converting to 4 byte hex . However, they do not include the decimal part of the utcnow() return function which in this case is important as it is expected to create a different hex for each microsecond change.

Upvotes: 3

Views: 5696

Answers (2)

FObersteiner
FObersteiner

Reputation: 25594

If you don't mind spending a few more bytes, using an ISO 8601 formatted string is a good choice because easy to read and clear how to interpret:

# 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

You can also use Unix time instead (as in the question you linked), which needs only 8 bytes:

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

Side-Note: don't use utcnow with this method.

Upvotes: 1

darren
darren

Reputation: 5734

This seems to be one solution:

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)

The result is:

20210416114300753898 # <- numeric
0x11879d26067ba17ea  # <- hex

Upvotes: 2

Related Questions