c# nodatime

c# - Instant.Now para NodaTime



(2)

Hice un poco de investigación y parece que la forma de NodaTime es obtener el momento actual de acuerdo con un clock .

Si desea obtener la hora actual utilizando el reloj del sistema, simplemente use SystemClock.Instance.GetCurrentInstant() .

Sin embargo, en lugar de usar SystemClock.Instance directamente en su código, es preferible que inyecte una dependencia IClock en sus clases de tiempo consciente.

Esto te permitirá:

  • proporcione a la clase SystemClock.Instance en tiempo de ejecución, por lo que el código utilizará la hora correcta
  • suministre una implementación falsa de IClock durante la prueba de unidades para permitirle ajustar el tiempo según sea necesario para probar varios escenarios (como el paso del tiempo). Hay un proyecto NodaTime.Testing que ofrece tal clase, llamado FakeClock .

Encuentro esto muy útil. Creo que tener algo como new Instant() o Instant.Now devuelve la hora actual facilitaría el uso de SystemClock de SystemClock debajo de las coberturas, por lo tanto, se pierde la ventaja de prueba que ofrece NodaTime.

Para obtener más información sobre las pruebas unitarias con NodaTime, consulte este enlace .

En cuanto a sus ejemplos de código: no son equivalentes.

  • Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime()) le dará el instante actual en UTC.
  • new Instant(DateTime.Now.ToUniversalTime().Ticks) le dará una fecha incorrecta en el futuro, ya que DateTime.Ticks de BCL representa el número de ticks desde el 1/1/0001 , y Instant.Ticks de Instant.Ticks representa el número de garrapatas desde el 1/1/1970 (ver el comentario here ).

Estoy tratando de controlar el uso del marco de Noda Time por Jon Skeet (y otros).

Estoy tratando de almacenar la corriente ahora (Instant). Instant se crea a partir de un tick largo, pero ¿cuál es el conteo actual de Ticks?

Lo es:

Instant now = new Instant(DateTime.Now.ToUniversalTime().Ticks);

Y o?

Instant now = Instant.FromDateTimeUtc(DateTime.Now.ToUniversalTime());

¿Son equivalentes, estoy haciendo esto bien?

PD: si Jon responde esto, me gustaría proponer una propiedad Instant.Now.

PS2 Sé que el título contiene una etiqueta, pero no me dejaría tener un título corto "Instant.Now".


SystemClock.Now devuelve la hora actual como un valor Instant :

Instant now = SystemClock.Instance.Now;

Pero es posible que desee prestar atención a los comentarios en la documentación de la interfaz de IClock :

IClock está diseñado para su uso en cualquier lugar donde necesite tener acceso a la hora actual. Aunque no es estrictamente incorrecto llamar a SystemClock.Instance.Now directamente, de la misma forma en que podría llamar a UtcNow , está totalmente desaconsejado como cuestión de estilo para el código de producción. Recomendamos proporcionar una instancia de IClock a cualquier cosa que lo necesite, lo que le permite escribir pruebas utilizando el reloj auxiliar en el conjunto de prueba de NodaTime (o su propia implementación).

Como ejemplo simple, suponga que tiene una clase de Logger que necesita la hora actual. En lugar de acceder directamente a SystemClock , use una instancia de IClock que se suministra a través de su constructor:

public class Logger { private readonly IClock clock; public Logger(IClock clock) { this.clock = clock; } public void Log(string message) { Instant timestamp = this.clock.Now; // Now log the message with the timestamp... } }

Cuando crea una instancia de un Logger en su código de producción, puede asignarle SystemClock.Instance . Pero en una prueba unitaria para la clase Logger , puedes darle un FakeClock .