.NET 6/C# 10 introdujo estructuras TimeOnly y DateOnly , para representar solo una hora y solo una fecha respectivamente.
La buena y antigua estructura DateTime siempre tenía una propiedad estática Now que le daría la fecha y la hora actuales.
Esperaba que las estructuras TimeOnly y DateOnly tuvieran propiedades estáticas similares; como TimeOnly.Now o DateOnly.Today , pero aparentemente no lo hacen.
Entonces, ¿qué debo hacer si quiero un objeto DateOnly que represente la fecha actual o un objeto TimeOnly que represente la hora actual?
Y también me gustaría saber POR QUÉ decidieron no incluir propiedades como esa en estas dos nuevas estructuras.
Puede usar el método .FromDateTime() ,
Para obtener la fecha actual solamente:
var dateNow = DateOnly.FromDateTime(DateTime.Now);Para obtener la hora actual solamente:
var timeNow = TimeOnly.FromDateTime(DateTime.Now); Para obtener más detalles, puede consultar el problema de Github . Hay varios buenos comentarios que explican por qué la propiedad .Now no se introduce en DateOnly y TimeOnly
¿Por qué las propiedades .Today , .Now y UtcNow no se introducen en DateOnly ?
DateOnly no relacionado con las zonas horarias El siguiente comentario de @tarekgh , explicó una mayor complejidad si introducen estas propiedades en DateOnly .
Después de leer el hilo de github y un par de otras documentaciones, siento que presentar las estructuras DateOnly y TimeOnly es solo para desacoplar DateTime .
Este desacoplamiento de fecha y hora nos ayudará en el futuro a realizar cálculos individuales en Date y Time por separado.
Esto nos ayudará a diseñar nuestras clases modelo con precisión y a nivel granular.
Para obtener el objeto DateOnly que representa la fecha actual, puede usar:
var currentDate = DateOnly.FromDateTime(DateTime.Now);De manera similar, para obtener el objeto TimeOnly que representa la fecha actual, puede usar:
var currentTime = TimeOnly.FromDateTime(DateTime.Now);El razonamiento detrás de no incluir la propiedad .Now se analiza en detalle aquí: https://github.com/dotnet/runtime/issues/53498
La forma de crear un objeto TimeOnly o DateOnly que represente la fecha o la hora actual sería usar el método estático FromDateTime junto con DateTime.Now . Asi como:
TimeOnly now = TimeOnly.FromDateTime(DateTime.Now); DateOnly today = DateOnly.FromDateTime(DateTime.Now); Si esto es algo que necesita repetidamente en su proyecto, para evitar la duplicación, puede crear métodos de extensión en DateTime para convertir una instancia de DateTime en TimeOnly o DateOnly :
public static class DateTimeExtensions { public static TimeOnly ToTimeOnly(this DateTime dateTime) { return TimeOnly.FromDateTime(dateTime); } public static DateOnly ToDateOnly(this DateTime dateTime) { return DateOnly.FromDateTime(dateTime); } }Uso:
TimeOnly now = DateTime.Now.ToTimeOnly(); DateOnly today = DateTime.Now.ToDateOnly(); Tenga en cuenta que esto no solo sería útil para obtener la fecha o la hora actual como TimeOnly o DateOnly , sino también para convertir cualquier instancia de DateTime en TimeOnly o DateOnly .
Otro enfoque sería tener dos clases estáticas como las siguientes:
public static class TimeOnlyHelpers { public static TimeOnly Now => TimeOnly.FromDateTime(DateTime.Now); } public static class DateOnlyHelpers { public static DateOnly Today => DateOnly.FromDateTime(DateTime.Now); }Uso:
TimeOnly now = TimeOnlyHelpers.Now; DateOnly today = DateOnlyHelpers.Today;DateOnly y TimeOnly ? La razón por la que no se agregaron propiedades Now o Today a estas estructuras se analizó aquí en esta edición de GitHub .
En resumen, no querían incluir zonas horarias y todo en DateOnly y TimeOnly ya que eso agregaría una complejidad adicional, por lo que decidieron no hacerlo y mantuvieron las nuevas estructuras simples y explícitas.
Sin embargo, existe cierta discusión sobre si una propiedad como esa podría agregarse a una clase Clock (todavía es una propuesta, puede seguirla aquí ) para que el uso sea similar a TimeOnly now = SystemClock.Local.Now , o para DateOnly como DateOnly today = SystemClock.Local.Today o algo así. Pero eso aún está indeciso.