artificer/api/date_time/parse.zig

43 lines
1.1 KiB
Zig

const std = @import("std");
pub fn parseDateTime(datetime: []const u8) ?f64 {
const time_h = @cImport({
@cDefine("_XOPEN_SOURCE", "700");
@cInclude("stddef.h");
@cInclude("stdio.h");
@cInclude("time.h");
@cInclude("timegm.h");
});
var buffer: [256]u8 = undefined;
var fba = std.heap.FixedBufferAllocator.init(&buffer);
var allocator = fba.allocator();
const datetime_z = allocator.dupeZ(u8, datetime) catch return null;
var tm: time_h.tm = .{};
const s = time_h.strptime(datetime_z, "%Y-%m-%dT%H:%M:%S.", &tm);
if (s == null) {
return null;
}
const s_len = std.mem.len(s);
if (s[s_len-1] != 'Z') {
return null;
}
const milliseconds_str = s[0..(s_len-1)];
var milliseconds: f64 = @floatFromInt(std.fmt.parseUnsigned(u32, milliseconds_str, 10) catch return null);
while (milliseconds >= 1) {
milliseconds /= 10;
}
const seconds: f64 = @floatFromInt(time_h.my_timegm(&tm));
return seconds + milliseconds;
}
test "parse date time" {
try std.testing.expectEqual(1723069394.105, parseDateTime("2024-08-07T22:23:14.105Z").?);
}