MoreDateTime – Extensión de biblioteca ExtendedDateTime para .NET

Una biblioteca de extensión para simplificar el manejo de los objetos DateTime, DateOnly, TimeOnly y TimeSpan de .NET, también incluye soporte para el perfil EDTF de ISO 8601.

Estado de compilaciónVersión de NuGet

📅 MoreDateTime – Github / Docs

⭐ Novedades v1.3 ⭐

Incluido recientemente: soporte para el Perfil de Formato de Fecha y Hora Extendido ISO 8601-2 2019 (EDTF).

Puedes usar la nueva clase ExtendedDateTime de la misma manera que usarías la clase .NET DateTime, con la mayoría de las conversiones entre ExtendedDateTime, DateTime y DateOnly soportadas.
Se admiten todos los formatos especificados en el estándar. La implementación se basa en la implementación de EDTF.NET, que a su vez se basa en el borrador del estándar ISO.

Ejemplo:

var algunaFechaEnLos60s = new ExtendedDateTime("1960S2");
var haceMuchoTiempo = new ExtendedDateTime("Y-3388E2S3"); // sí, eso corresponde a algún año entre 338000 y 338999, estimado en 338800
var cuatroAñosEn1670 = new ExtendedDateTime("1670..1673");
var algúnDíaEnPrimavera = new ExtendedDateTime("2021-21");
var unRango = new ExtendedDateTime("..1983-12-31,1984-10-10..1984-11-01,1984-11-05.."); // en algún momento antes de 1983, entre 1984-10-10 y 1984-11-01, y después de 1984-11-05

Como ves, hay muchas posibilidades para especificar fechas y rangos de fechas.

Aún falta documentación, pero pronto se solucionará. También faltan algunas limpiezas menores de código.

PD: Me encantaría incluir un soporte completo para ISO 8601-2 2019, pero eso es una gran tarea, tal vez algún día. Sin embargo, se aceptan voluntarios.

Descripción

Esta biblioteca está diseñada desde cero para ser una biblioteca de fechas y horas simple, fácil de usar e intuitiva para .NET, que simplifica tareas comunes y proporciona una API coherente para trabajar con fechas y horas, mediante los objetos DateTime, DateOnly, TimeOnly y TimeSpan de .NET. Agrega muchas operaciones que uno espera encontrar en una biblioteca de fechas y horas, pero que faltan en la biblioteca estándar de .NET. Actualmente cuenta con más de 300 métodos para trabajar con fechas, horas y rangos (períodos).

Sin embargo, no pretende reemplazar ninguna parte de la biblioteca estándar de .NET, sino más bien ser una extensión de la misma. Se basa en la biblioteca estándar de .NET existente y no reemplaza ninguna de las funcionalidades existentes. Tampoco pretende ser un reemplazo para la biblioteca NodaTime, pero se puede usar en conjunto.

Las conversiones entre los tipos o las operaciones con tipos mixtos (usando DateTime y DateOnly, por ejemplo, sin convertir uno en el otro manualmente) son posibles.

Por ejemplo: NextWeek() para avanzar un DateTime o DateOnly hasta el mismo día de la semana en la siguiente semana, NextYear() para agregar un año a un objeto DateTime o DateOnly (sí, por supuesto que se puede usar el método existente .AddYears(1), pero no se ve tan claro), NextWorkday() para avanzar el objeto DateTime o DateOnly al siguiente día laborable en el Calendar dado.

O cosas como IsWeekend() lo cual, por supuesto, también se puede hacer con myDate.DayOfWeek == DayOfWeek.Saturday || myDate.DayOfWeek == DayOfWeek.Sunday, pero simplemente no es tan agradable de leer. Luego también tenemos IsWorkday() que es lo opuesto a IsWeekend() y también IsHoliday() que verifica si la fecha dada es un feriado en el calendario dado.

Sin mencionar el método IsBetween() que es un método muy útil para verificar si una fecha está entre otras dos fechas. También admite los objetos DateOnly y TimeOnly.

Para operaciones más elaboradas tenemos las Enumeraciones, como EnumerateDaysUntil, EnumerateMonthsUntil, EnumerateYearsUntil, EnumerateWeeksUntil, EnumerateWorkdaysUntil, EnumerateWeekendsUntil, EnumerateHolidaysUntil.

Finalmente, puedes agregar minutos a un objeto DateOnly (siempre que sea más de un día) -> myDate.AddMinutes(525600); // eso es un año en minutos o incluso horas o segundos si lo deseas.

¿Quieres saber el PrimerLunesDelMes? -> myDate.FirstMondayOfTheMonth() o el ÚltimoViernesDelMes? -> myDate.LastFridayOfTheMonth(). ¿Cuántas veces has necesitado saber el primer o último día del mes? -> myDate.FirstDayOfTheMonth() o myDate.LastDayOfTheMonth().

¿Necesitas saber el número de días laborables en un período? -> myDate.NumberOfDaysUntil() o el número de feriados en un período? -> myDate.NumberOfHolidaysUntil().

También puedes crear enumeraciones personalizadas con EnumerateInStepsUntil que te permite crear enumeraciones desde una fecha de inicio o hora hasta una fecha de finalización o hora en pasos especificados por un TimeSpan. Como en

void ListAllDaysNotHolidays(DateOnly startDate)
{
	// puedes proporcionar también un objeto Calendar al método EnumerateInStepsUntil si la Cultura actual no es adecuada
	var myEnum = startDate.EnumerateInStepsUntil(startDate.AddMonths(6), TimeSpan.FromDays(1), SkipHolidays);

	foreach (var item in myEnum)
	{
		Console.WriteLine(item);
	}

	bool SkipHolidays(DateOnly date) => return !date.IsHoliday();
}

Otro ejemplo, crea períodos de 10 minutos durante una semana, pero saltea la medianoche

void Get10MinuteSpans(DateTime startDate)
{
	var myEnum = startDate.EnumerateInStepsUntil(startDate.NextWeek(), TimeSpan.FromMinutes(10), SkipMidnight);

	foreach (var item in myEnum)
	{
		Console.WriteLine(item);
	}

	bool SkipMidnight(DateTime date)
	{
		return !date.IsMidnight();
	}
}

Tienes tu propio IDateTimeProvider a través del cual puedes inyectar tu propia fecha y hora y admite burlarse directamente. En lugar de DateTime.UtcNow puedes usar DateTimeProvider.Current.UtcNow y siempre obtener la fecha y hora que esperas.

¿Cómo usarlo?

Solo tienes que instalar el paquete NuGet ¡y listo! Se basa principalmente en el sentido común al usar objetos de Fecha y Hora en .NET.

Dependencias

Para cálculos de feriados utiliza la biblioteca Nager.Date, pero necesitas traer tu propia clave de licencia. También hay un DefaultHolidayProvider() que conoce solo los pocos feriados internacionales y es el predeterminado. Opcionalmente puedes usar tu propio proveedor a través de la interfaz IHolidayProvider y el método DateTimeProvider.SetHolidayProvider().

Nota

La documentación está en su mayoría completa, aunque puede haber algunas descripciones faltantes o incluso incorrectas (generalmente errores de copiar y pegar). Si encuentras algo que falta o está incorrecto, por favor avísame.

Las pruebas unitarias cubren aproximadamente el 98%, todavía no se cubren algunos casos extremos. Por lo tanto, hay una gran confianza en que el código funcione correctamente.

Ejemplos

NuGet

El paquete NuGet está disponible a través de NuGet

PM> install-package MoreDateTime

Ejemplos para .NET (paquete NuGet)

próximamente

Ejemplo 1 – por determinar

--> ejemplo de código aquí, llegará en breve

Leave a Reply

Your email address will not be published. Required fields are marked *