Ir al contenido principal

Métodos de Fechas y Horas

ValiFlow<T> soporta validación de fechas y horas para cuatro tipos de .NET: DateTime, DateTimeOffset, DateOnly y TimeOnly. Los métodos que dependen de constantes en tiempo de ejecución (como "hoy", "esta semana") son de uso solo en memoria y no pueden ser traducidos por EF Core. Para alternativas seguras en base de datos, usa ValiFlowQuery<T> donde esté disponible.

Ejemplos: ValiFlow · Evaluators


DateTime

FutureDate

Pasa cuando el valor es mayor que DateTime.UtcNow.

var rule = new ValiFlow<Product>()
.FutureDate(x => x.ExpiresAt);

PastDate

Pasa cuando el valor es menor que DateTime.UtcNow.

var rule = new ValiFlow<Order>()
.PastDate(x => x.CreatedAt);

IsToday

Pasa cuando el valor cae en la fecha UTC de hoy.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Order>()
.IsToday(x => x.ScheduledAt);

IsYesterday

Pasa cuando el valor cae en la fecha UTC de ayer.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Order>()
.IsYesterday(x => x.CreatedAt);

IsTomorrow

Pasa cuando el valor cae en la fecha UTC de mañana.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Task>()
.IsTomorrow(x => x.DueDate);

IsWeekend

Pasa cuando el valor cae en sábado o domingo.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Event>()
.IsWeekend(x => x.EventDate);

IsWeekday

Pasa cuando el valor cae entre lunes y viernes.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Appointment>()
.IsWeekday(x => x.AppointmentDate);

IsDayOfWeek

Pasa cuando el valor cae en un día específico de la semana.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Meeting>()
.IsDayOfWeek(x => x.Date, DayOfWeek.Monday);

IsInMonth

Pasa cuando el mes del valor es igual al mes especificado (1–12).

var rule = new ValiFlow<Order>()
.IsInMonth(x => x.Date, 12);

IsInYear

Pasa cuando el año del valor es igual al año especificado (1–9999).

var rule = new ValiFlow<Order>()
.IsInYear(x => x.Date, 2025);

IsBefore

Pasa cuando el valor es estrictamente menor que el límite dado.

var cutoff = new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc);

var rule = new ValiFlow<Order>()
.IsBefore(x => x.Date, cutoff);

IsAfter

Pasa cuando el valor es estrictamente mayor que el límite dado.

var cutoff = DateTime.UtcNow.AddDays(-30);

var rule = new ValiFlow<Order>()
.IsAfter(x => x.Date, cutoff);

BetweenDates

Pasa cuando el valor cae dentro del rango [from, to] (inclusive).

var from = new DateTime(2025, 1, 1, 0, 0, 0, DateTimeKind.Utc);
var to = new DateTime(2025, 12, 31, 23, 59, 59, DateTimeKind.Utc);

var rule = new ValiFlow<Order>()
.BetweenDates(x => x.Date, from, to);

ExactDate

Pasa cuando el valor cae en la misma fecha calendario UTC que el objetivo.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Order>()
.ExactDate(x => x.Date, DateTime.UtcNow);

BeforeDate

Pasa cuando la fecha calendario UTC del valor es anterior a la fecha objetivo.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Order>()
.BeforeDate(x => x.Date, DateTime.UtcNow);

AfterDate

Pasa cuando la fecha calendario UTC del valor es posterior a la fecha objetivo.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Order>()
.AfterDate(x => x.Date, DateTime.UtcNow);

SameMonthAs

Pasa cuando el valor comparte el mismo año y mes que la referencia.

var reference = DateTime.UtcNow;

var rule = new ValiFlow<Order>()
.SameMonthAs(x => x.Date, reference);

SameYearAs

Pasa cuando el valor comparte el mismo año que la referencia.

var rule = new ValiFlow<Order>()
.SameYearAs(x => x.Date, DateTime.UtcNow);

InLastDays

Pasa cuando el valor cae dentro de los últimos N días desde ahora.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Order>()
.InLastDays(x => x.CreatedAt, 7);

InNextDays

Pasa cuando el valor cae dentro de los próximos N días desde ahora.

Nota: Solo en memoria — no traducible por EF Core.

var rule = new ValiFlow<Task>()
.InNextDays(x => x.DueDate, 30);

DateTimeOffset

DateTimeOffset expone el mismo conjunto de métodos que DateTime. Los métodos que operan sobre .UtcDateTime.Date son solo en memoria.

var rule = new ValiFlow<Order>()
.FutureDate(x => x.ExpiresAt) // > DateTimeOffset.UtcNow
.PastDate(x => x.CreatedAt) // < DateTimeOffset.UtcNow
.IsToday(x => x.ScheduledAt) // solo en memoria
.IsYesterday(x => x.UpdatedAt) // solo en memoria
.IsTomorrow(x => x.DueAt) // solo en memoria
.IsWeekend(x => x.EventAt) // solo en memoria
.IsWeekday(x => x.AppointmentAt) // solo en memoria
.IsDayOfWeek(x => x.At, DayOfWeek.Friday) // solo en memoria
.IsInMonth(x => x.At, 6)
.IsInYear(x => x.At, 2025)
.IsBefore(x => x.At, DateTimeOffset.UtcNow.AddDays(-1))
.IsAfter(x => x.At, DateTimeOffset.UtcNow.AddDays(-30))
.BetweenDates(x => x.At, from, to)
.ExactDate(x => x.At, DateTimeOffset.UtcNow) // solo en memoria
.BeforeDate(x => x.At, DateTimeOffset.UtcNow) // solo en memoria
.AfterDate(x => x.At, DateTimeOffset.UtcNow) // solo en memoria
.SameMonthAs(x => x.At, reference)
.SameYearAs(x => x.At, reference)
.InLastDays(x => x.At, 7) // solo en memoria
.InNextDays(x => x.At, 30); // solo en memoria

DateOnly

DateOnly soporta la mayoría de los mismos métodos. Los métodos de día de la semana (IsWeekend, IsWeekday, IsDayOfWeek) no están disponibles. IsLastDayOfMonth es un método adicional específico de DateOnly.

IsLastDayOfMonth

Pasa cuando la fecha es el último día de su mes. Es seguro para EF Core — usa el truco AddDays(1).Month != Month que se traduce correctamente.

var rule = new ValiFlow<Invoice>()
.IsLastDayOfMonth(x => x.BillingDate);

Ejemplo completo con DateOnly:

var rule = new ValiFlow<Order>()
.FutureDate(x => x.ExpiresOn)
.PastDate(x => x.CreatedOn)
.IsToday(x => x.ScheduledOn) // solo en memoria
.IsYesterday(x => x.ProcessedOn) // solo en memoria
.IsTomorrow(x => x.DueOn) // solo en memoria
.IsInMonth(x => x.Date, 12)
.IsInYear(x => x.Date, 2025)
.IsBefore(x => x.Date, new DateOnly(2026, 1, 1))
.IsAfter(x => x.Date, new DateOnly(2024, 1, 1))
.BetweenDates(x => x.Date, from, to)
.SameMonthAs(x => x.Date, DateOnly.FromDateTime(DateTime.UtcNow))
.SameYearAs(x => x.Date, DateOnly.FromDateTime(DateTime.UtcNow))
.InLastDays(x => x.Date, 7) // solo en memoria
.InNextDays(x => x.Date, 30) // solo en memoria
.IsLastDayOfMonth(x => x.Date); // seguro para EF Core

TimeOnly

IsBefore

Pasa cuando la hora es estrictamente anterior a la hora dada.

var rule = new ValiFlow<Shift>()
.IsBefore(x => x.StartTime, TimeOnly.Parse("18:00"));

IsAfter

Pasa cuando la hora es estrictamente posterior a la hora dada.

var rule = new ValiFlow<Shift>()
.IsAfter(x => x.StartTime, TimeOnly.Parse("09:00"));

BetweenTimes

Pasa cuando la hora cae dentro del rango [inicio, fin] (inclusive).

var rule = new ValiFlow<Shift>()
.BetweenTimes(x => x.StartTime, TimeOnly.Parse("08:00"), TimeOnly.Parse("17:00"));

IsAM

Pasa cuando la hora es menor que 12 (de medianoche a las 11:59 AM).

var rule = new ValiFlow<Event>()
.IsAM(x => x.Time);

IsPM

Pasa cuando la hora es 12 o mayor (de mediodía a las 11:59 PM).

var rule = new ValiFlow<Event>()
.IsPM(x => x.Time);

Mini ejemplos

1) Ventana de envío

var regla = new ValiFlow<Order>()
.IsAfter(o => o.ShipDate, DateTime.UtcNow)
.BetweenDates(o => o.ShipDate, DateTime.UtcNow, DateTime.UtcNow.AddDays(30));

2) Día hábil

var regla = new ValiFlow<Schedule>()
.IsWeekday(x => x.Day)
.IsAM(x => x.Time);