forked from
slices.network/quickslice
Auto-indexing service and GraphQL API for AT Protocol Records
1-module(timestamp_ffi).
2-export([microseconds_to_iso8601/1]).
3
4%% Convert microseconds since Unix epoch to ISO8601 format
5%% Includes millisecond precision for better accuracy
6%% Uses the event's original timestamp from the Jetstream event for accurate indexedAt values
7microseconds_to_iso8601(Microseconds) ->
8 %% Convert microseconds to seconds and get the remainder for milliseconds
9 Seconds = Microseconds div 1000000,
10 Milliseconds = (Microseconds rem 1000000) div 1000,
11
12 %% Convert Unix timestamp to datetime
13 DateTime = calendar:system_time_to_universal_time(Seconds, second),
14 {{Year, Month, Day}, {Hour, Minute, Second}} = DateTime,
15
16 %% Format with leading zeros
17 YearStr = io_lib:format("~4..0B", [Year]),
18 MonthStr = io_lib:format("~2..0B", [Month]),
19 DayStr = io_lib:format("~2..0B", [Day]),
20 HourStr = io_lib:format("~2..0B", [Hour]),
21 MinuteStr = io_lib:format("~2..0B", [Minute]),
22 SecondStr = io_lib:format("~2..0B", [Second]),
23 MillisStr = io_lib:format("~3..0B", [Milliseconds]),
24
25 %% Concatenate and convert to binary (Gleam string)
26 %% Format: YYYY-MM-DDTHH:MM:SS.sssZ
27 iolist_to_binary([
28 YearStr, "-", MonthStr, "-", DayStr, "T",
29 HourStr, ":", MinuteStr, ":", SecondStr, ".", MillisStr, "Z"
30 ]).