Got conversion to timestamp working and passing tests

This commit is contained in:
Nathan Fisher 2023-06-13 01:35:05 -04:00
parent 7bfdd02688
commit f4c138b2a4

View File

@ -35,7 +35,7 @@ pub const Year = union(YearTag) {
} }
pub fn seconds(self: Self) i64 { 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 { pub fn get(self: Self) u31 {
@ -99,8 +99,8 @@ pub const Month = enum(u4) {
}; };
} }
pub fn seconds(self: Self) u32 { pub fn seconds(self: Self, year: Year) u32 {
return self.days() * SECONDS_PER_DAY; return @as(u32, self.days(year)) * SECONDS_PER_DAY;
} }
pub fn next(self: Self) ?Self { pub fn next(self: Self) ?Self {
@ -252,35 +252,39 @@ pub const DateTime = struct {
} }
pub fn toTimestamp(self: Self) i64 { pub fn toTimestamp(self: Self) i64 {
var seconds = 0; var seconds: i64 = 0;
if (self.year.get() < 1970) { if (self.year.get() < 1970) {
var year = Year.new(1970); var year = Year.new(1970);
while (year != self.year) { while (year.get() != self.year.get()) {
year = year.previous(); year = year.previous();
seconds -= year.seconds(); seconds -= year.seconds();
} }
} else if (self.year.get() > 1970) { } else if (self.year.get() > 1970) {
var year = Year.new(1970); var year = Year.new(1970);
while (year != self.year) { while (year.get() != self.year.get()) {
seconds += year.seconds(); seconds += year.seconds();
year = year.next(); year = year.next();
} }
} }
var month = Month.january; var month = Month.january;
while (month != self.month) { while (month != self.month) {
seconds += month.seconds(); seconds += month.seconds(self.year);
month = month.next().?; month = month.next().?;
} }
seconds += (self.day - 1) * SECONDS_PER_DAY; seconds += @as(i64, self.day - 1) * SECONDS_PER_DAY;
if (self.hours) |h| { if (self.hour) |h| {
seconds += h * 3600; seconds += @as(i64, h - 1) * 3600;
} }
if (self.minutes) |m| { if (self.minute) |m| {
seconds += m * 60; seconds += @as(i64, m) * 60;
} }
if (self.seconds) |s| { if (self.second) |s| {
seconds += s; seconds += s;
} }
switch (self.tz) {
.utc => {},
.offset => |ofs| seconds -= ofs.asSeconds(),
}
return seconds; return seconds;
} }
}; };
@ -312,3 +316,31 @@ test "get offset" {
}; };
try testing.expectEqual(dt.getOffset().?, Offset{ .negative = .{ .hours = 5, .minutes = null } }); 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);
}