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