From f4c138b2a4cf70eac942877c80951d49fbac7f09 Mon Sep 17 00:00:00 2001 From: Nathan Fisher Date: Tue, 13 Jun 2023 01:35:05 -0400 Subject: [PATCH] Got conversion to timestamp working and passing tests --- src/main.zig | 58 ++++++++++++++++++++++++++++++++++++++++------------ 1 file changed, 45 insertions(+), 13 deletions(-) diff --git a/src/main.zig b/src/main.zig index e2da630..5bb15dc 100644 --- a/src/main.zig +++ b/src/main.zig @@ -35,7 +35,7 @@ pub const Year = union(YearTag) { } pub fn seconds(self: Self) i64 { - return self.days * SECONDS_PER_DAY; + return @as(i64, self.days()) * SECONDS_PER_DAY; } pub fn get(self: Self) u31 { @@ -99,8 +99,8 @@ pub const Month = enum(u4) { }; } - pub fn seconds(self: Self) u32 { - return self.days() * SECONDS_PER_DAY; + pub fn seconds(self: Self, year: Year) u32 { + return @as(u32, self.days(year)) * SECONDS_PER_DAY; } pub fn next(self: Self) ?Self { @@ -252,35 +252,39 @@ pub const DateTime = struct { } pub fn toTimestamp(self: Self) i64 { - var seconds = 0; + var seconds: i64 = 0; if (self.year.get() < 1970) { var year = Year.new(1970); - while (year != self.year) { + while (year.get() != self.year.get()) { year = year.previous(); seconds -= year.seconds(); } } else if (self.year.get() > 1970) { var year = Year.new(1970); - while (year != self.year) { + while (year.get() != self.year.get()) { seconds += year.seconds(); year = year.next(); } } var month = Month.january; while (month != self.month) { - seconds += month.seconds(); + seconds += month.seconds(self.year); month = month.next().?; } - seconds += (self.day - 1) * SECONDS_PER_DAY; - if (self.hours) |h| { - seconds += h * 3600; + seconds += @as(i64, self.day - 1) * SECONDS_PER_DAY; + if (self.hour) |h| { + seconds += @as(i64, h - 1) * 3600; } - if (self.minutes) |m| { - seconds += m * 60; + if (self.minute) |m| { + seconds += @as(i64, m) * 60; } - if (self.seconds) |s| { + if (self.second) |s| { seconds += s; } + switch (self.tz) { + .utc => {}, + .offset => |ofs| seconds -= ofs.asSeconds(), + } return seconds; } }; @@ -312,3 +316,31 @@ test "get offset" { }; try testing.expectEqual(dt.getOffset().?, Offset{ .negative = .{ .hours = 5, .minutes = null } }); } + +test "to timestamp utc" { + const dt = DateTime{ + .year = Year.new(2023), + .month = .june, + .day = 13, + .hour = 6, + .minute = 21, + .second = 22, + .nanos = null, + .tz = .utc, + }; + try testing.expectEqual(dt.toTimestamp(), 1686633682); +} + +test "to timestamp negative offset" { + const dt = DateTime{ + .year = Year.new(2023), + .month = .june, + .day = 13, + .hour = 1, + .minute = 21, + .second = 22, + .nanos = null, + .tz = TimeZone.new(-5, null).?, + }; + try testing.expectEqual(dt.toTimestamp(), 1686633682); +}