Auto-indexing service and GraphQL API for AT Protocol Records
at main 30 lines 1.3 kB view raw
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 ]).