Operaciones con trimestres
IValiDateQuarter proporciona operaciones completas de trimestre del año. Está incluido en el paquete Vali-Time y se registra automáticamente al llamar a AddValiTime() o AddValiTempo().
API de IValiDateQuarter
QuarterOf
Devuelve el número de trimestre (1–4) de la fecha dada:
int q = quarter.QuarterOf(new DateTime(2025, 5, 15));
// → 2 (abril–junio)
int q2 = quarter.QuarterOf(new DateTime(2025, 11, 1));
// → 4 (octubre–diciembre)
Firma: int QuarterOf(DateTime dt)
QuarterStart
Devuelve el primer día del trimestre que contiene la fecha dada:
DateTime start = quarter.QuarterStart(new DateTime(2025, 8, 20));
// → 2025-07-01 (Q3 comienza el 1 de julio)
Firma: DateTime QuarterStart(DateTime dt)
QuarterEnd
Devuelve el último día del trimestre que contiene la fecha dada:
DateTime end = quarter.QuarterEnd(new DateTime(2025, 8, 20));
// → 2025-09-30 (Q3 termina el 30 de septiembre)
Firma: DateTime QuarterEnd(DateTime dt)
QuarterName
Devuelve el nombre corto del trimestre ("Q1", "Q2", "Q3" o "Q4"):
string name = quarter.QuarterName(new DateTime(2025, 4, 1));
// → "Q2"
Firma: string QuarterName(DateTime dt)
QuarterNameFull
Devuelve el nombre descriptivo completo incluyendo el año:
string full = quarter.QuarterNameFull(new DateTime(2025, 4, 1));
// → "Q2 2025 (Apr – Jun)"
Firma: string QuarterNameFull(DateTime dt)
DaysInQuarter
Devuelve el número total de días en el trimestre que contiene la fecha dada:
int days = quarter.DaysInQuarter(new DateTime(2024, 2, 1)); // Q1 de año bisiesto
// → 91 (ene 31 + feb 29 + mar 31)
int days2 = quarter.DaysInQuarter(new DateTime(2025, 4, 1)); // Q2
// → 91 (abr 30 + may 31 + jun 30)
Firma: int DaysInQuarter(DateTime dt)
DaysElapsedInQuarter
Devuelve el número de días transcurridos desde el inicio del trimestre (base 1):
int elapsed = quarter.DaysElapsedInQuarter(new DateTime(2025, 4, 15));
// → 15 (el 15 de abril es el día 15 del Q2)
Firma: int DaysElapsedInQuarter(DateTime dt)
DaysRemainingInQuarter
Devuelve el número de días restantes hasta el final del trimestre (incluyendo el último día):
int remaining = quarter.DaysRemainingInQuarter(new DateTime(2025, 9, 28));
// → 3 (quedan sep 28, 29, 30)
Firma: int DaysRemainingInQuarter(DateTime dt)
ProgressInQuarter
Devuelve un valor entre 0.0 y 1.0 que representa qué tan avanzado está el trimestre en la fecha dada:
decimal progress = quarter.ProgressInQuarter(new DateTime(2025, 7, 1));
// → 0.0 (primer día del Q3)
decimal progress2 = quarter.ProgressInQuarter(new DateTime(2025, 9, 30));
// → ~1.0 (último día del Q3)
Firma: decimal ProgressInQuarter(DateTime dt)
IsFirstDayOfQuarter
Devuelve true si la fecha es el primer día calendario de su trimestre:
bool first = quarter.IsFirstDayOfQuarter(new DateTime(2025, 10, 1));
// → true (el 1 de oct inicia el Q4)
bool notFirst = quarter.IsFirstDayOfQuarter(new DateTime(2025, 10, 2));
// → false
Firma: bool IsFirstDayOfQuarter(DateTime dt)
IsLastDayOfQuarter
Devuelve true si la fecha es el último día calendario de su trimestre:
bool last = quarter.IsLastDayOfQuarter(new DateTime(2025, 6, 30));
// → true (el 30 de jun termina el Q2)
Firma: bool IsLastDayOfQuarter(DateTime dt)
IsInSameQuarter
Devuelve true si dos fechas caen en el mismo trimestre del mismo año:
bool same = quarter.IsInSameQuarter(
new DateTime(2025, 4, 1),
new DateTime(2025, 6, 30));
// → true (ambas en Q2 2025)
bool notSame = quarter.IsInSameQuarter(
new DateTime(2025, 3, 31),
new DateTime(2025, 4, 1));
// → false (Q1 vs Q2)
Firma: bool IsInSameQuarter(DateTime a, DateTime b)
WeeksInQuarter
Devuelve el número de semanas ISO que se superponen con el trimestre:
int weeks = quarter.WeeksInQuarter(new DateTime(2025, 1, 1));
// → ~13
Firma: int WeeksInQuarter(DateTime dt)
DayOfQuarter
Devuelve la posición ordinal del día dentro del trimestre (base 1):
int day = quarter.DayOfQuarter(new DateTime(2025, 4, 5));
// → 5 (5° día del Q2)
Firma: int DayOfQuarter(DateTime dt)
NextQuarterStart
Devuelve el primer día del siguiente trimestre:
DateTime next = quarter.NextQuarterStart(new DateTime(2025, 8, 15));
// → 2025-10-01 (inicio del Q4)
DateTime next2 = quarter.NextQuarterStart(new DateTime(2025, 12, 31));
// → 2026-01-01 (inicio del Q1 del año siguiente)
Firma: DateTime NextQuarterStart(DateTime dt)
PreviousQuarterStart
Devuelve el primer día del trimestre anterior:
DateTime prev = quarter.PreviousQuarterStart(new DateTime(2025, 8, 15));
// → 2025-04-01 (inicio del Q2)
DateTime prev2 = quarter.PreviousQuarterStart(new DateTime(2025, 1, 15));
// → 2024-10-01 (inicio del Q4 del año anterior)
Devuelve DateTime.MinValue cuando no existe un trimestre anterior (es decir, la fecha está en el Q1 del año 1). Usa TryPreviousQuarterStart para distinguir este valor centinela de una fecha real.
Firma: DateTime PreviousQuarterStart(DateTime dt)
TryNextQuarterStart
Alternativa segura a NextQuarterStart para usar cerca de DateTime.MaxValue. Devuelve false (y establece result en DateTime.MaxValue) cuando el siguiente trimestre desbordaría más allá del año 9999; de lo contrario devuelve true y el primer día del siguiente trimestre.
var valiDate = new ValiDate();
if (valiDate.TryNextQuarterStart(new DateTime(2025, 8, 15), out var next))
Console.WriteLine(next); // 2025-10-01
// Devuelve false cerca de DateTime.MaxValue
bool ok = valiDate.TryNextQuarterStart(new DateTime(9999, 10, 1), out _); // false
Firma: bool TryNextQuarterStart(DateTime date, out DateTime result)
TryPreviousQuarterStart
Alternativa segura a PreviousQuarterStart para usar cerca de DateTime.MinValue. Devuelve false (y establece result en DateTime.MinValue) cuando la fecha está en el Q1 del año 1 y no existe trimestre anterior; de lo contrario devuelve true y el primer día del trimestre anterior.
var valiDate = new ValiDate();
if (valiDate.TryPreviousQuarterStart(new DateTime(2025, 5, 1), out var prev))
Console.WriteLine(prev); // 2025-01-01 00:00:00
// Devuelve false cerca de DateTime.MinValue
bool ok = valiDate.TryPreviousQuarterStart(new DateTime(1, 2, 1), out _); // false
Firma: bool TryPreviousQuarterStart(DateTime date, out DateTime result)
Ejemplo completo
public class QuarterlyReportService(IValiDateQuarter quarter)
{
public void PrintQuarterSummary(DateTime date)
{
int q = quarter.QuarterOf(date);
string name = quarter.QuarterNameFull(date);
DateTime qStart = quarter.QuarterStart(date);
DateTime qEnd = quarter.QuarterEnd(date);
int total = quarter.DaysInQuarter(date);
int elapsed = quarter.DaysElapsedInQuarter(date);
int remaining = quarter.DaysRemainingInQuarter(date);
decimal progress = quarter.ProgressInQuarter(date);
Console.WriteLine($"Quarter: {name}");
Console.WriteLine($"Span: {qStart:MMM dd} – {qEnd:MMM dd}");
Console.WriteLine($"Total: {total} days");
Console.WriteLine($"Elapsed: {elapsed} days ({progress:P1})");
Console.WriteLine($"Left: {remaining} days");
DateTime next = quarter.NextQuarterStart(date);
Console.WriteLine($"Next Q starts: {next:yyyy-MM-dd}");
}
}