diff options
| author | Bobby <[email protected]> | 2026-02-20 16:01:59 +0530 |
|---|---|---|
| committer | Bobby <[email protected]> | 2026-02-20 16:01:59 +0530 |
| commit | 91e2c4202a6772a3e3de4cae8c671d4d79cb7af0 (patch) | |
| tree | dd0b75465a3c90b4f8a9acc22652a85431347756 /system/libraries/datetime/format.zig | |
| parent | c1c827540981247fd943318f503e5d814e91921d (diff) | |
| download | akiba-91e2c4202a6772a3e3de4cae8c671d4d79cb7af0.tar.xz akiba-91e2c4202a6772a3e3de4cae8c671d4d79cb7af0.zip | |
feat: Add datetime and OS information libraries with formatting and retrieval functions
Diffstat (limited to 'system/libraries/datetime/format.zig')
| -rw-r--r-- | system/libraries/datetime/format.zig | 111 |
1 files changed, 111 insertions, 0 deletions
diff --git a/system/libraries/datetime/format.zig b/system/libraries/datetime/format.zig new file mode 100644 index 0000000..daebd10 --- /dev/null +++ b/system/libraries/datetime/format.zig @@ -0,0 +1,111 @@ +//! Date/time formatting + +const time = @import("time.zig"); + +const MONTH_NAMES = [_][]const u8{ "Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec" }; + +pub fn date(timestamp: u64, buf: []u8) []const u8 { + if (timestamp == 0) { + const default = "01 Jan 1970 00:00"; + for (default, 0..) |c, i| { + buf[i] = c; + } + return buf[0..default.len]; + } + + const dt = time.parts(timestamp); + var pos: usize = 0; + + // Day + if (dt.day < 10) { + buf[pos] = '0'; + pos += 1; + } + pos += writeInt(dt.day, buf[pos..]); + + buf[pos] = ' '; + pos += 1; + + // Month name + const month_idx = if (dt.month > 0 and dt.month <= 12) dt.month - 1 else 0; + for (MONTH_NAMES[month_idx]) |c| { + buf[pos] = c; + pos += 1; + } + + buf[pos] = ' '; + pos += 1; + + // Year + pos += writeInt(dt.year, buf[pos..]); + + buf[pos] = ' '; + pos += 1; + + // Hour + if (dt.hour < 10) { + buf[pos] = '0'; + pos += 1; + } + pos += writeInt(dt.hour, buf[pos..]); + + buf[pos] = ':'; + pos += 1; + + // Minute + if (dt.minute < 10) { + buf[pos] = '0'; + pos += 1; + } + pos += writeInt(dt.minute, buf[pos..]); + + return buf[0..pos]; +} + +pub fn duration(total_secs: u64, buf: []u8) []const u8 { + const hours = total_secs / 3600; + const mins = (total_secs % 3600) / 60; + const secs = total_secs % 60; + + var pos: usize = 0; + + pos += writeInt(hours, buf[pos..]); + buf[pos] = 'h'; + pos += 1; + buf[pos] = ' '; + pos += 1; + + pos += writeInt(mins, buf[pos..]); + buf[pos] = 'm'; + pos += 1; + buf[pos] = ' '; + pos += 1; + + pos += writeInt(secs, buf[pos..]); + buf[pos] = 's'; + pos += 1; + + return buf[0..pos]; +} + +fn writeInt(value: u64, buf: []u8) usize { + if (value == 0) { + buf[0] = '0'; + return 1; + } + + var temp: [20]u8 = undefined; + var len: usize = 0; + var v = value; + + while (v > 0) : (v /= 10) { + temp[len] = @intCast('0' + (v % 10)); + len += 1; + } + + for (0..len) |i| { + buf[i] = temp[len - 1 - i]; + } + + return len; +} |
