msgpack_datetime https://sr.ht/~nabijaczleweli/msgpack_datetime https://hexdocs.pm/msgpack_datetime/MsgpackDateTime.html Unpack Elixir DateTimes from msgpack extension -1 timestamp fields All three formats described in https://github.com/msgpack/msgpack/blob/master/spec.md#timestamp-extension-type are supported for packing and unpacking (timestamp 32/64/96). msgpack only tries the ext callbacks for tuples (which is how Erlang structs are implemented) but packs maps (Elixir structs) as maps. Thus, to pack, DateTime.now_utc(), you'd pack it as {MsgpackDateTime, DateTime.now_utc()}, and you'll get back {MsgpackDateTime, %DateTime{}} in return. Example: dt = ~U[2025-12-10 12:53:25Z] :msgpack.pack({MsgpackDateTime, dt}, ext: MsgpackDateTime) === <<214, 255, 105, 57, 109, 69>> :msgpack.unpack("\x93\xC4\x06record\xD6\xFFi9mE\xCD\x01\xA4", ext: MsgpackDateTime) === {:ok, ["record", {MsgpackDateTime, dt}, 420]} The MsgpackDateTime.StructWrap module contains functions to do this automatically for terms containing maps and lists: :msgpack.pack(dt |> MsgpackDateTime.StructWrap.wrap(), ext: MsgpackDateTime) === <<214, 255, 105, 57, 109, 69>> {:ok, unpacked} = :msgpack.unpack("\\x93\\xC4\\x06record\\xD6\\xFFi9mE\\xCD\\x01\\xA4", ext: MsgpackDateTime) unpacked |> MsgpackDateTime.StructWrap.unwrap() === ["record", dt, 420] https://hex.pm/packages/msgpack_datetime def deps do [ {:msgpack_datetime, "~> 0.1"} ] end Reproduce test data with: apt install libmsgpack-cxx-dev make ./testdata [dir] Release tarballs are signed with nabijaczleweli@nabijaczleweli.xyz (pull with WKD, but 7D69 474E 8402 8C5C C0C4 4163 BCFD 0B01 8D26 58F1). аnd stored in git notes as-if via the example program provided at https://man.sr.ht/git.sr.ht/#signing-tags-tarballs and are thus available on the refs listing/tag page as .tar.gz.asc.