viernes, 2 de mayo de 2014

Receta No. 2-7 en C#: Crear Horas y Fechas a partir de Cadenas de Caracteres

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. Notas Finales
6. Conclusiones
7. Glosario
8. Enlaces & Literatura

0. Introducción

Ya hemos visto que las expresiones regulares nos sirve para validar la entrada del usuario desde diferentes fuentes (entrada estándar, formularios, archivos de texto). Los conceptos aprendidos hasta el momento acerca de validación nos pueden servir para entender otras implementaciones de tipos de datos que para poder operar requieren de datos limpios (término que utilizo para referirme a datos precisos y exactos). Y esto lo vamos a aprovechar para crear horas y fechas a partir de cadenas de texto que deben ser validadas para su consiguiente instanciación.

1. Problema

El equipo de programación se encuentra creando la implementación para procesar los datos ingresados en los formularios (campos, tablas, áreas de texto, &c.), en particular aquellos que correspondan con las fechas de las operaciones y campos introducidos por los usuarios de la nueva aplicación. Las fechas son cadenas de caracteres (string - estado natural), per se, deben ser convertidas a un objeto de clase System.DateTime.

2. Solución

El programador encargado ha encontrado en librería estándar del Framework .NET que existen un par de recursos útiles para hacer este tipo de conversión (cadenas de texto a instancias de DateTime):
  • Parse, y
  • ParseExact

3. Discusión de la Solución

Vamos a conocer cómo funcionan los métodos Parse y ParseExact de la clase DateTime.

El primero de estos, Parse [2], toma una cadena de caracteres como origen de datos e intenta a llevar estas acciones por defecto:
  • Pasada una cadena de caracteres, intentará crear un objeto DateTime con información omitida o errónea en la fuente de datos. Los valores erróneos los sustituirá por valores por defecto. Esto también aplica para la carencia de datos de hora y fecha en la cadena original.
    • Cuando la fecha es errónea o no está especificada se deja por defecto la fecha actual.
    • En el caso de la hora, se deja 12:00:00 a.m.
    • En la situación de no poder realizar ninguna de las anteriores, la instanciación no será posible, y se lanzará la excepción System.FormatException [4].
En [1] comentan:
The Parse method is both flexible and forgiving. However, for many applications, this level of flexibility is unnecessary.
A lo que puedo agregar el nivel de flexibilidad además de innecesario puede conducir a la generación de datos imprecisos.

Ejemplo básico:

string cadenaFecha = "Fri, 02 May 2008 21:02:19 GMT";
DateTime fechaConvertida = DateTime.Parse(cadenaFecha);
Console.WriteLine("Resultado: {0}", fechaConvertida);

// Resultado: 5/1/2008 12:34:42 AM

Por otro lado, para remover el grado de flexibilidad mencionado, también contamos con un método alternativo para llevar validaciones más robustas y exigentes sobre las cadenas de texto: ParseExact [3].

Presento la versión sobrecargada más sencilla de ParseExact para dar los puntos claves sobre utilidad y funcionalidad. Esta es su firma:

public static DateTime ParseExact(string s, string format, IFormatProvider provider) [5]

Descripción:
  • s: Fecha y hora como cadenas de caracteres.
  • format: Formato de hora y fecha requerido para la cadena s.
  • provider: Formato basado en regionalización y cultura (referencia a IFormatProvider [6]).
En caso de el valor de la variable provider sea null, entonces se utilizará los valores de regionalización y cultura del hilo de ejecución actual [1].

Además de lo anterior, si el formato especificado por format, no se cumple, se generará la excepción System.FormatException.

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

Vamos aplicar los conceptos anteriores para crear crear una demostración del uso de Parse y ParseExact.


Compilación:


  1. csc /target:exe ConvertidorFechaHora.cs

Resultado:
Resultados prueba DateTime.Parse y DateTime.ParseExact
Figura 1. Resultados prueba DateTime.Parse y DateTime.ParseExact.


5. Notas Adicionales

Extracto literal desde [1] para conocer más acerca de las buenas prácticas al usar la clase DateTime:
Buenas prácticas uso de la clase DateTime
Figura 2. Buenas prácticas uso de la clase DateTime [1].

Conclusiones

Comprendimos cómo usar dos métodos para la validación de fechas guardadas como una cadena de caracteres (string): DateTime.Parse(string), y DateTime.ParseExact(string, string, IFormatProvider). En el ejemplo en la sección práctica, vimos que estos métodos generan valores por defecto cuando la fecha no está completa; como en el caso de "Oct 2005" y "13:17".

Glosario


  • Conversión
  • Cultura
  • Regionalización
  • Validación

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]: DateTime.Parse Method (System) - http://msdn.microsoft.com/en-us/library/system.datetime.parse%28v=vs.110%29.aspx
[3]: DateTime.ParseExact Method (System) - http://msdn.microsoft.com/en-us/library/system.datetime.parseexact%28v=vs.110%29.aspx
[4]: FormatException Class (System) - http://msdn.microsoft.com/en-us/library/system.formatexception%28v=vs.110%29.aspx
[5]: DateTime.ParseExact Method (String, String, IFormatProvider) (System) - http://msdn.microsoft.com/en-us/library/w2sa9yss%28v=vs.110%29.aspx
[6]: IFormatProvider Interface (System) - http://msdn.microsoft.com/en-us/library/system.iformatprovider%28v=vs.110%29.aspx


M

No hay comentarios:

Publicar un comentario

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