miércoles, 7 de mayo de 2014

Receta No. 2-7 en C#: Efectuar Operaciones Aritméticas sobre Horas y Fechas

Tabla de Contenido

0. Introducción
1. Problema
2. Solución
3. Discusión de la Solución
4. Práctica: Código Fuente C#
5. Conclusiones
6. Glosario
7. Enlaces & Literatura

0. Introducción

En nuestra receta anterior aprendimos a crear representaciones de horas y fechas a partir de cadenas de caracteres -cfr. Receta No. 2-7 en C#: Crear Horas y Fechas a partir de Cadenas de Caracteres-, entonces vamos a aprovechar esta experiencia anterior para crear una receta para realizar operaciones aritméticas. A parte de las operaciones aritméticas, también utilizaremos operadores de comparación (menor que, mayor que, igual que, &c.) sobre este tipo de estructuras apropiadas para representar horas y fechas en nuestras aplicaciones.

1. Problema

En la actualidad tenemos varias operaciones sobre las fechas además de las comunes:
  • Captura de diferentes medios: archivos de texto, entrada de formularios en las aplicaciones, y flujos de red.
  • Almacenamiento en bases de datos.
  • Representación en reportes de resumen de cuentas.
Sin embargo, otras operaciones básicas como obtener la diferencia de dos fechas de eventos sobre un registro de actividad de usuario se realiza extrayendo subcadenas que representan el año, el día, y el mes. Esto utilizando métodos de la clase String [3] (i.e., IndexOf, Substring):

int annio = Convert.ToInt32(objetoDateTime.ToString().Substring(0,4));

Esto evidentemente resulta incomodo programáticamente, pues debemos recurrimos a técnicas de manipulación de datos que podríamos calificar de artesanales y propensas a romperse: porque debemos conocer los datos y su estructura sobre el objeto DateTime.

El equipo de programación necesita una solución eficiente y contundente para este caso.

2. Solución

Gracias a que en C# podemos sobrecargar los operadores primitivos (+, -, <, >,  &c.) -cfr. Receta No. 1-21 en C#: Sobrecargar un Operador- las estructuras DateTime [5] y TimeSpan [6] soportan las operaciones aritméticas básicas, además de las comparativas (menor, mayor que, igual que, &c.). Vamos aprovechar la sobrecarga de estos operadores para sustituir el método artesanal que utilizamos actualmente para este cometido.

3. Discusión de la Solución

Ya nos enteramos que tanto DateTime y TimeSpan soportan versiones sobrecargadas de los operadores aritméticos y comparativos. En la Figura 1 [1] se describen todas estas operaciones que podemos realizar sobre este par de estructuras.
Operaciones aritméticas y comparativas sobre fechas y horas
Figura 1. Operaciones aritméticas y comparativas sobre fechas y horas [1].
Continuando, vale hacer los siguientes apuntes sobre DateTime y TimeSpan:
  • DateTime: representa fechas y horas en un instante de tiempo específico:
    • Dic 2006
    • Thursday 6 October 2005 13:17:19
    • 6,10,5
    • 6/10/2005 13:17:19
    • 13:17
  • TimeSpan: representa intervalos de tiempo.c
    • 02:13:19
    • 6/19/2010 10:53:00 PM
    • 6/13/2010 9:32:00 PM
  • En ambas estructuras se representa el tiempo como un tictac (equivalente inglés: tick). Cada tictac equivale a 100 nanosegundos.
  • Las fechas empiezan a contar a partir de las 12:00:00 de la medianoche del primero de del año 0001 CE (Common Era ~= Anno Domini (AD) [7]).
Los dos últimos puntos podemos inferir que la representación interna está dada por números enteros, y esto es lo que va a facilitar que podamos sumar, restar fechas y horas.


Veamos una descripción más completa de los operadores soportados sobre DateTime y TimeSpan en las Figuras 2, y 3, respectivamente.
Descripción operadores de DateTime
Figura 2. Descripción operadores de DateTime [5].

Descripción operadores de TimeSpan
Figura 3. Descripción operadores de TimeSpan [6].
[Nota: Sugiero la lectura y estudio de la descripción de estas dos estructuras en los enlaces [5] y [6] para conocer más acerca de los métodos, propiedades, constructores disponibles para cada una.]

4. Práctica: Código Fuente C#

Veamos este ejemplo de demostración de uso de las estructuras DateTime y TimeSpan para concretar conceptos vistos en la sección anterior.

Archivo UsoDateTimeSpan.cs:

Compilación:


  1. csc /target:exe UsoDateTimeSpan.cs

> Prueba de ejecución.

Resultados (este instante):


Instante actual: 5/11/2014 8:31:12 AM
Hace una semana: 5/4/2014 8:31:12 AM
Próxima semana: 5/18/2014 8:31:12 AM
ahora > semanaPasada: True
ahora == siguienteSemana: False

5. Conclusiones

Aprendimos a realizar operaciones aritméticas: suma y resta, y operaciones comparativas sobre estructuras que representa horas y fechas, e intervalos de tiempo: DateTime y TimeSpan, respectivamente. Nos resultan útil para evitar uso de técnicas artesanales (i.e., extracción de valores de cadenas de caracteres) sobre estructuras de hora y fecha.

6. Glosario

  • Anno Domini
  • DateTime
  • Estructura
  • Fecha y hora
  • SpanTime

7. Enlaces & Literatura

[1]: Visual C# 2010 Recipes by Allen Jones and Adam Freeman. Copyright 2010 Allen Jones and Adam Freeman, 978-1-4302-2525-6.
[2]: Receta No. 2-7 en C#: Operaciones Aritméticas sobre Horas y Fechas - http://ortizolandroidev.blogspot.com/2014/05/introduccion-xamarin-studio-parte-2.html
[3]: String Class (System) - http://msdn.microsoft.com/en-us/library/system.string%28v=vs.110%29.aspx
[4]: Receta No. 1-21 en C#: Sobrecargar un Operador | OrtizOL - Experiencias Construcción Software (xCSw) - http://ortizol.blogspot.com/2014/04/receta-no-1-21-en-c-sobrecargar-un.html
[5]: DateTime Structure (System) - http://msdn.microsoft.com/en-us/library/system.datetime.aspx
[6]: TimeSpan Structure (System) - http://msdn.microsoft.com/en-us/library/system.timespan.aspx
[7]: Anno Domini, the free encyclopedia - https://en.wikipedia.org/wiki/Anno_Domini


M

No hay comentarios:

Publicar un comentario

Envíe sus comentarios, dudas, sugerencias, críticas. Gracias.