miércoles, 1 de junio de 2016

Manipulación de Fechas y Horas en C# - Parte 2/5: La Estructura DateTime

Índice

1. Introducción
2. Palabras Clave
3. Estructura DateTime
4. Creación de Objetos DateTime
5. Métodos static
5.1 Fecha actual
5.2 Ayer
5.3 Último día del año
5.4 Número de días del mes
5.5 Mañana
6. Propiedades
7. null en DateTime
8. Conclusiones
9. Literatura & Enlaces

1. Introducción

La estructura DateTime está diseñada para la representación de un fecha y/o hora. En esta segunda parte de la serie Manipulación de Fechas y Horas en C# se describe esta estructura, resaltando su utilidad en la construcción de la funcionalidad de una aplicación que requiera manipular -almacenar, recuperar, representar- fechas y horas tanto para datos de aplicación como de usuario. (Es necesario que se presente esta estructura para luego realizar un contraste con la estructura DateTimeOffset.)

2. Palabras Clave

  • Fecha
  • Hora
  • Tiempo
  • UTC

3. Estructura DateTime

La estructura DateTime está definida en el namespace System. Esta estructura representa una fecha y, opcionalmente, una hora. Al igual que TimeSpan, cuenta con una precisión de 100 ns (nanosegundos) (Albahari, 2012).

Otra característica a resaltar, se encuentra la del rango de años que puede representar: 0001 hasta 9999. (Esta característica es fundamental a considerar para aquellas aplicaciones que pueden requerir fechas con años diferentes a ese rango.)

4. Creación de Objetos DateTime

En la siguiente figura se muestran todos los constructores disponibles para la instanciación de un DateTime.
Constructores de DateTime
Figura 1. Constructores de DateTime ("DateTime Struct", 2016).

Nótese que a parte de las versiones básicas, es decir las versiones sobrecargadas que sólo requieren el tipo de dato integrado Int32, existen variantes con Calendar; con este parámetro se instruye cómo ha de interpretarse el año, el mes y el día.

Además, se cuenta con otras versiones sobrecargadas que especifican como parámetro al tipo de dato DateTimeKind ("DateTimeKind Enumeration", 2016) el cual se usa para representar horas locales, UTC (Coordinated Universal Time) o sin especificación (para fechas y horas independientes de la ubicación).

Ejemplo de uso:

Para crear un objeto de DateTime con la fecha y hora en la que se está redactando este artículo, la sintaxis a seguir es la siguiente:

DateTime fechaActual = new DateTime(2016, 6, 1, 6, 34, 53);

O de forma alternativa:

string strFechaActual = "6/1/2016 6:34:53";
DateTime fechaActual = DateTime.Parse(strFechaActual);

En la última línea de código se usa el método Parse que recibe como argumento una cadena de caracteres. Hay que tener en cuenta que en caso de que la fecha representada como cadena de caracteres llegará a ser inválida, se genera una excepción. Un método de conversión opcional es TryParse: éste trata de convertir la fecha, en caso de ser válida retorna true en caso contrario false.

Por otro lado, un aspecto adicional a considerar es el de la omisión de la hora: cuando esto ocurre la hora por defecto asignada al objeto DateTime recién creado es 0:00 (medianoche) (Albahari, 2016).

Ejemplo de uso:

Por defecto, la instanciación de DateTime hace uso del calendario gregoriano. Para usar uno diferente se usa la versión sobrecargada:

DateTime(..., Calendar)

(La elipsis para hacer referencia a variantes con diferentes número de argumentos.)

Con 

DateTime fecha = new DateTime(7576, 1, 1, new System.Globalization.HebrewCalendar());

HebrewCalendar es una subclase de Calendar, y es usada para determinar que el objeto DateTime recién creado representa es del calendario hebreo.

5. Métodos static

Los métodos static de DateTime permiten:
  • Aritmética de años, meses, días, horas, minutos, segundos, y tics (cada tic equivalente a 100ns).
  • Comparación de fechas
  • Conversión de diferentes fuentes
  • Determinación de si el año es bisiesto
  • Representaciones en otros tipos de datos
  • Parseo

5.1 Fecha actual

Por ejemplo, el método Parse convierte una fecha representada como una cadena de caracteres -string- a un objeto DateTime:

string strFechaActual = "6/1/2016 6:34:53";
DateTime fechaActual = DateTime.Parse(strFechaActual);

5.2 Ayer

DateTime hoy = DateTime.Today;
DateTime ayer = hoy.AddDays(-1);

En este caso se obtiene el día actual con Today y con el método AddDays se obtiene el día inmediatamente anterior -ayer- con una resta aritmética de días.

5.3 Último día del año

Con el siguiente código C# obtenemos el último día del año:

DateTime ultimoDia = new DateTime(2016 + 1, 1, 1);
Console.WriteLine (ultimoDia.AddDays(-1));

5.4 Número de días del mes

El método DaysInMonth permite la obtención del número de días para un año y mes dados:

int dias = DateTime.DaysInMonth(2016, 2);

5.5 Mañana

DateTime hoy = new Datime.Now;
Console.WriteLine (hoy.AddDays(1));

El código anterior obtiene la fecha del día siguiente -mañana-.

6. Propiedades

La estructura DateTime cuenta con una variedad de propiedades para obtener valores como de la fecha como:
  • Día
  • Hora
  • Minutos
  • Segundos
  • Milisegundos
  • Año
  • Fecha actual
A través de la propiedad Now se obtiene la fecha y hora actuales. En el siguiente ejemplo se muestra que a partir de la hora actual local se calcula las diferentes representaciones de fecha por cada región horaria especificada:

Ejemplo de uso:

En la línea 13 se obtienen la fecha y hora actuales. En el arreglo regionesHorarias se crean las cadenas de caracteres que representan las configuraciones de fecha y hora para cada país e idioma. En el ciclo foreach (líneas 19-24) se muestra en la salida estándar la representación de cada fecha y hora en la región correspondiente.

7. null en DateTime

Por definición una instancia de una estructura no permite la asignación de null. Un intento de asignación de este tipo dará como error de compilación el código CS0037 ("Compiler error", 2016). En su lugar se opta por asignar uno de estos valores:
Es necesario advertir que la última opción ofrece mayor grado de compatibilidad con versiones anteriores a C# 2.0 (Albahari, 2012).

8. Conclusiones

Se estudió la estructura DateTime y sus funciones más sobresalientes. Principalmente sus constructores, métodos y propiedades. En cuanto a los constructores, se mostró que existen distintas alternativas para definir una fecha; de igual modo con los métodos que cuenta esta clase el programador puede manipular fechas y horas de forma granular (tal como se enseñó en las sección 5. Al final se describieron las propiedades a través de un ejemplo de código que presenta cómo por medio de la propiedad Now es posible obtener la fecha y hora actuales, y luego hacer una representación en diferentes configuraciones regionales.

9. Literatura & Enlaces

Albahari, J., Albahari, B. (2012). C# 5.0 in a Nutshell. United States: O'Reilly Media.
DateTime Structure (System) (2016, junio 1). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.datetime.aspx
DateTimeKind Enumeration (System) (2016, junio 1). Recuperado desde: https://msdn.microsoft.com/en-us/library/shx7s921.aspx
Calendar Class (System.Globalization) (2016, junio 1). Recuperado desde: https://msdn.microsoft.com/en-us/library/system.globalization.calendar%28v=vs.110%29.aspx
Compiler Error CS0037 (2016, junio 1). Recuperado desde: https://msdn.microsoft.com/en-us/library/6z0y399a.aspx?f=255&MSPPError=-2147217396


V

No hay comentarios:

Publicar un comentario

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