zdt-prov/src/delta.zig
2026-01-17 16:03:50 -03:00

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;
}
}
};