aboutsummaryrefslogtreecommitdiff
path: root/system.old/libraries/datetime/format.zig
blob: daebd10847c174aefccd2cdad0a8ab32d783e4bc (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
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;
}