c# - Obtención de LocalDateTime del sistema en Noda Time
nodatime (1)
¿Cuál es la forma idiomática de obtener la hora del sistema como LocalDateTime
en Noda Time? El método más directo que podría pensar sería
var dt = DateTime.Now
LocalDateTime systemTime = new LocalDateTime(dt.Year, dt.Month, dt.Day, dt.Hour, dt.Minute);
pero dado que todo el propósito de Noda Time es reemplazar DateTime con algo que tenga una semántica más agradable , asumí que había un método preferido que usar DateTime
de la manera anterior. Lo mejor que pude encontrar usando las instalaciones de Noda es
var zone = NodaTime.TimeZones.BclDateTimeZone.ForSystemDefault();
LocalDateTime systemTime = SystemClock.Instance.Now.InZone(zone).LocalDateTime;
Pero esto parece bastante detallado.
Tu segundo ejemplo es exactamente cómo harías esto. Es intencionalmente verbosa. Ver la filosofía de diseño de Noda Time .
Piénsalo en tres partes:
Consigue el momento actual en el tiempo:
// Instant now = SystemClock.Instance.Now; // NodaTime 1.x Instant now = SystemClock.Instance.GetCurrentInstant(); // NodaTime 2.x
Obtener la zona horaria del sistema. (Esta es la sintaxis preferida)
DateTimeZone tz = DateTimeZoneProviders.Bcl.GetSystemDefault();
Aplicar la zona horaria al instante:
ZonedDateTime zdt = now.InZone(tz);
Su último paso para obtener LocalDateTime
es trivial, pero reconozca que cuando lo hace, está eliminando cualquier información de zona horaria. "Local" en NodaTime no significa "local para la computadora donde se ejecuta el código". (En otras palabras, no es como DateTimeKind.Local
)
Cosas adicionales para pensar:
Es posible que prefiera abstraer el reloj mediante la interfaz
IClock
:IClock clock = SystemClock.Instance; // Instant now = clock.Now; // NodaTime 1.x Instant now = clock.GetCurrentInstant(); // NodaTime 2.x
Luego, puede pasar el reloj como parámetro del método o inyectarlo con su marco DI / IoC favorito. (Autofac, Ninject, StructureMap, lo que sea ...). La ventaja es que puedes usar un
NodaTime.Testing.FakeClock
durante tus pruebas de unidad. Ver Unidad de Pruebas con Noda Time para más detalles.También es posible que prefieras pasar el
DateTimeZone
para poder ejecutar tu código en cualquier lugar sin estar vinculado a la zona horaria del sistema. Esto es importante para las aplicaciones de servidor, pero no tanto para las aplicaciones de escritorio / móviles.Si tiene otro trabajo que está usando las zonas horarias de la IANA, o si está usando la compilación estándar de .NET de Noda Time, cambie el paso 2 para usar el proveedor
Tzdb
:DateTimeZone tz = DateTimeZoneProviders.Tzdb.GetSystemDefault();
Las zonas TZDB son mucho más precisas que las zonas BCL. Noda Time asignará la zona horaria de Windows (BCL) de su sistema a una zona horaria IANA (TZDB) en esta llamada inicial.
Si tiene curiosidad por DateTime.Now
por qué DateTime.Now
es tan compacto mientras que Noda Time es tan detallado, intente descompilar DateTime.Now
o mirando las fuentes de referencia de MS. Verás que está haciendo esencialmente los mismos pasos debajo del capó.