.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.