83 lines
2.5 KiB
Zig
83 lines
2.5 KiB
Zig
// Em time.zig (ou crie um novo arquivo relativedelta.zig e importe)
|
|
|
|
pub const RelativeDelta = struct {
|
|
years: i32 = 0,
|
|
months: i32 = 0,
|
|
days: i32 = 0,
|
|
hours: i32 = 0,
|
|
minutes: i32 = 0,
|
|
seconds: i32 = 0,
|
|
|
|
pub fn init(fields: struct {
|
|
years: i32 = 0,
|
|
months: i32 = 0,
|
|
days: i32 = 0,
|
|
hours: i32 = 0,
|
|
minutes: i32 = 0,
|
|
seconds: i32 = 0,
|
|
}) RelativeDelta {
|
|
return .{
|
|
.years = fields.years,
|
|
.months = fields.months,
|
|
.days = fields.days,
|
|
.hours = fields.hours,
|
|
.minutes = fields.minutes,
|
|
.seconds = fields.seconds,
|
|
};
|
|
}
|
|
|
|
// Helpers úteis (muito usados depois)
|
|
pub fn isZero(self: RelativeDelta) bool {
|
|
return self.years == 0 and
|
|
self.months == 0 and
|
|
self.days == 0 and
|
|
self.hours == 0 and
|
|
self.minutes == 0 and
|
|
self.seconds == 0;
|
|
}
|
|
|
|
pub fn inSeconds(self: RelativeDelta) i64 {
|
|
return @as(i64, self.years) * 365 * 24 * 60 * 60 +
|
|
@as(i64, self.months) * 30 * 24 * 60 * 60 +
|
|
@as(i64, self.days) * 24 * 60 * 60 +
|
|
@as(i64, self.hours) * 60 * 60 +
|
|
@as(i64, self.minutes) * 60 +
|
|
@as(i64, self.seconds);
|
|
}
|
|
|
|
pub fn inDays(self: RelativeDelta) i64 {
|
|
return @as(i64, self.years) * 365 +
|
|
@as(i64, self.months) * 30 +
|
|
@as(i64, self.days);
|
|
}
|
|
|
|
pub fn normalize(self: *RelativeDelta) void {
|
|
// Normaliza meses → anos + meses
|
|
if (self.months >= 12 or self.months <= -12) {
|
|
const carry = @divTrunc(self.months, 12);
|
|
self.years += carry;
|
|
self.months -= carry * 12;
|
|
}
|
|
|
|
// Normaliza segundos → minutos + segundos
|
|
if (self.seconds >= 60 or self.seconds <= -60) {
|
|
const carry = @divTrunc(self.seconds, 60);
|
|
self.minutes += carry;
|
|
self.seconds -= carry * 60;
|
|
}
|
|
|
|
// Normaliza minutos → horas + minutos
|
|
if (self.minutes >= 60 or self.minutes <= -60) {
|
|
const carry = @divTrunc(self.minutes, 60);
|
|
self.hours += carry;
|
|
self.minutes -= carry * 60;
|
|
}
|
|
|
|
// Normaliza horas → dias + horas
|
|
if (self.hours >= 24 or self.hours <= -24) {
|
|
const carry = @divTrunc(self.hours, 24);
|
|
self.days += carry;
|
|
self.hours -= carry * 24;
|
|
}
|
|
}
|
|
};
|