Trabajando con Fechas - DateTime

En este tutorial veremos cómo trabajar con el tipo Datetime, el cual nos permite trabajar con fechas. En el mundo laboral, que es básicamente lo importante, utilizamos fechas continuamente, por lo que es importante tener los siguientes  conceptos claros. 

1 - Creación del objeto Datetime

Para crear el objeto Datetime tenemos multitud de opciones como podemos observar:

public DateTime(long ticks);
public DateTime(long ticks, DateTimeKind kind);
public DateTime(int year, int month, int day);
public DateTime(int year, int month, int day, Calendar calendar);
public DateTime(int year, int month, int day, int hour, int minute, int second);
public DateTime(int year, int month, int day, int hour, int minute, int second, DateTimeKind kind);
public DateTime(int year, int month, int day, int hour, int minute, int second, Calendar calendar);
public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond);
public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, DateTimeKind kind);
public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar);
public DateTime(int year, int month, int day, int hour, int minute, int second, int millisecond, Calendar calendar, DateTimeKind kind);

Sin embargo dos de ellas son las mas comunes, ya que son las que utilizamos cuando queremos compara fechas, y cuando queremos comparar tiempo además de fechas.

public DateTime(int year, int month, int day);
public DateTime(int year, int month, int day, int hour, int minute, int second);

Por lo que para crea un objeto de fecha utilizaremos la siguiente sentencia:

DateTime testFecha = new DateTime(1989, 11, 2, 11, 15, 16);

Donde:

  • 1989 es el año.
  • 11 es el mes.
  • 2 es el dia.
  • 11 es la hora, en formato 24h, por lo tanto, las 11 de la mañana.
  • 15 son los minutos.
  • 16 son los segundos. 

Otra opción para crear las fechas es utilizar los "ticks" o golpes de reloj, estos cuentan desde el 1 de enero de 1970.

public DateTime(long ticks);

Porque eligieron el 1 de enero de 1970. Bueno el motivo es que cuando estaban desarrollando unix neceistaban una fecha para empezar a contar y seleccionaron esa. No tiene ningún misterio ni ningún otro motivo oculto.

Finalmente, podemos convertir fehas desde un string, para el cual tenemos dos opciones.

DateTime ejemploFecha = Convert.ToDateTime("10/22/2015 12:10:15 PM"); 
DateTime ejemploFecha = DateTime.Parse("10/22/2015 12:10:15 PM");  

Ambas opciones son completamente válidas aunque tienen pequeñas diferencias internamente, las dos convertirán el texto en una fecha.

Desafortunadamente el ejemplo que tenemos encima no funciona correctamente, tan solo si estamos en una máquina de estados unidos, donde el formato para las fechas es mes/dia; Si por el contrario estamos en una máquina configurada para europa, el formato correcto para una fecha es dia/mes. *DesconozcoSudamérica.

1.1 - Locaización con cultureinfo

Para evitar este problema tenemos el tipo CultureInfo que se encuentra dentro de System.Globalization el cual nos permite especificar el formato de una feha, basandonos en el país junto al idioma. El siguiente código nos generaria el tipo CultureInfo con español de españa.

CultureInfo cultureInfoES = new CultureInfo("es-SP");

Mientras que si lo que queremos es un país de Sudámerica como por ejemplo Argentina, seria el siguiente código

CultureInfo cultureInfoAR = new CultureInfo("es-AR");

Por lo que para el ejemplo visto anteriormente (mes/dia) tenemos que utliizar el CultureInfo de Estados unidos:

CultureInfo cultureInfoUS = new CultureInfo("en-us");
DateTime ejemploFecha = Convert.ToDateTime("10/22/2015 12:10:15 PM", cultureInfoUS); 

Nota  muy importante: Si indicamos mal el CultureInfo, el programa crasheara y detendrá su ejecución así que hay que estar seguros con lo que hacemos.

1.2 - Propiedades del tipo Datetime

A raíz de la fecha anterior podemos obtener la mayoría de la información que comúnmente utilizamos, como pueden ser dia, mes, dia de la semana, et. Todo ello nos viene dentro del Tipo Datetime, por lo que no tenemos que crear ningún método para obtenerlo.

Aquí muestro una pequeña lista con algunos ejemplos:

int dia = fecha.Day; //Nos devuelve el dia del mes en número (1, 2...30, 31)
int mes = fecha.month; //Nos devuelve el número de mes
int year = fecha.Year; //Nos devuelve el año
int hora = fecha.Hour; //Devuelve la hora
int minuto = fecha.Minute; //devuelve el minuto
int segundo = fecha.Second; //devuelve los segundos.
string diaDeLaSemana = fecha.DayOfWeek; //Devuelve el dia de la semana con letra (lunes, martes... Domingo)
int diaDelyear = fecha.DayOfYear; //Devuelve en que dia del año estamos, con número.
DateTime tiempo= fecha.Date; //devuelve horas:minutos:segundos

 1.3 - Métodos del tipo Datetime

como en el caso anterior, el propio tipo nos trae infinidad de métodos para ser ejecutados. entre los que podemos añadir dias, meses o incluso tiempo.

fecha.AddDays(1); //añadira un día a la fecha actual
fecha.AddMonths(1);// Añadira un mes a la fecha actual.
fecha.AddYears(1); //Añadira un año a la fecha actual.

Como vemos todos los ejemplos son de añadir, pero qué pasa, si lo que queremos es restar dias, para ello tambien tenemos que utilizar el método de añadir, solo que el valor que le pasamos será negativo.

fecha.AddDays(-1); //restará un día a la fecha actual
fecha.AddMonths(-1);// restará un mes a la fecha actual.
fecha.AddYears(-1); //restará un año a la fecha actual.

Por último si lo que queremos es añadir tiempo, tenemos que utilizar un tipo concreto.

1.4 - El tipo TimeSpan

Similar al caso anterior, solo que ahora en el constructor podemos tenemos las opciones del tiempo

public TimeSpan(long ticks);
public TimeSpan(int hours, int minutes, int seconds);
public TimeSpan(int days, int hours, int minutes, int seconds);
public TimeSpan(int days, int hours, int minutes, int seconds, int milliseconds);

Como observamos, para crear el tiempo TimeSpan podemos hacerlo desde días, hasta los milisegundos. y lo realizaremos de la siguiente forma:

DateTime fecha = new Datetime(2019, 01, 01); 
//fecha tendrá el valor de 1 de enero de 2019 a las 00h 00m

TimeSpan tiempo = new TimeSpan (1, 5, 30, 5); 
//creamos un objeto timespan con valor de 1 dia, 5 horas, 30 minutos, 5 segundos

DateTime fechaActualizada = fecha.Add(tiempo);
//Sumamos el tiempo a la fecha anterior
//Resultado: 2 de enero de 2019 a las 5:30 de la mañana.

2 - Comparación de fechas

Comparar fechas es muy importante en el mundo real y es algo que hay que tener muy claro. Por ejemplo comparamos fechas dentro de filtros o en consultas a la base de datos, o consultas LINQ como la que vimos en el post anterior. 

Cuando comparamos lo podemos hacer de dos formas:

  • Utilizar el método DateTime.Compare(fecha1, fecha2) dentro del tipo estático DateTime.
  • Utilizar la propia feha para compararala con la segunda, fecha1.CompareTo(fecha2);

En ambos casos el resultado que nos devuelve es el mismo, nos devolverá un entero (int) que corresponde con lo siguiente:

  • menor que 0 si la primera fecha es menor que la segunda.
  • 0 si ambas fechas son iguales
  • mayor que 0 si la primera fecha es mayor que la segunda.
DateTime fecha1 = new DateTime(1989, 11, 2);
DateTime fecha2 = new DateTime(1978, 4, 15);
int fechaResultado = DateTime.Compare(fecha1, fecha2);
//O indistintamente
int fechaResultado = fecha1.CompareTo(fecha2); 

if (fechaResultado < 0)
{
	Console.WriteLine("La primera fecha es menor");
}
else if (fechaResultado == 0)
{
	Console.WriteLine("Las fechas son iguales");
}
else
{
	Console.WriteLine("La segunda fecha es menor");
}

3 - Imprimir la fecha con formato

Finalmente llegamos a la parte crucial, ya que al trabajar mucho con fechas también queremos poder imprimirlas. Y en este escenario, como en el anterior, también tenemos que fijarnos si tenemos que utilizar CultureInfo.

Por defecto, DateTime, nos trae varias funciones para imprimir las fechas con formatos por defecto, las cuales son las siguientes:

DateTime fecha= new DateTime(1989, 11, 2, 11, 15, 16);
fecha.ToString(); // resultado: 02/11/1989 11:15:16
fecha.ToShortDateString(); //resultado: 02/11/1989
fecha.ToLongDateSTring(); //Resultado: Jueves 2 octubre 1989
fecha.ToShortTimeString(); //resultado: 11:15

Además de las opciones que nos trae por defecto, podemos crear  nuestra propia versión utilizando el método .ToString() ya que si le pasamos un valor por parámetro el compilador lo traduce a lo que necesitamos.

Los ejemplos anteriores se pueden representar tansolo con .ToString()  de la siguiente manera:

 

Pero de qué nos sirve poder imprimir algo que ya podemos imprimir anteriormente. El método .ToString() es mucho más potente, ya que podemos pasarle una combinación de carácteres para que muestre el formato tal y como lo necesitamos. por ejempolo yyyy se traduce al año, MM se traduce al mes.

Algo muy común en todas las aplicaciones es tener un log, los logs guardan fecha y hora con precisión de microsegundo. Podemos crear un mensaje partiendo de una fecha que el formato sea similar al de un log.

DateTime fecha= new DateTime(1989, 11, 2, 11, 15, 16, 123);
fecha.ToString(yyy-MM-ddThh:mm:ss.ms); 
// resultado: 1989-01-11T11:15:16.123

Como podemos observar los caracteres como - o . tambíen salen representados en el resultado.

Además de estos, tenemos muchos más códigos para pasar en el método .ToString() posteriormente podemos utilizar cualquiera de los métodos disponibles en la clase string.

Finalmente una tabla con todo lo que el método .ToString() permite añadir, notese la diferencia entre mayúsculas y minúsculas.

Epecificación Descripción Salida
d Fecha corta 02/11/1989
D Fecha larga jueves 2 Noviembre 1989
t Tiempo corto 11:15
T Tiempo largo 11:16:16
f Fecha y hora completa corto Jueves 2 Noviembre 1989 11:15
F Fecha y hora completa largo  Jueves 2 Noviembre 1989 11:15:16
g/G fecha y hora por defecto 02/11/1989 11:15
M Día y mes 02-Nov
r RFC 1123 fecha Jue 02 Nov 1989 11:15:16 GTM
s fecha y hora para ordenar 1989-11-02T11:15:16
u tiempo universal, con timezone  1989-11-02T11:15:16z
Y mes año Noviembre 1989
dd Día 2
ddd día corto  Jue
dddd día completo Jueves
hh hora con 2 digitos 11
HH hora con 2 digitos formato 24h 23
mm mintuo con 2 digitos 15
MM mes 11
MMM nombre mes corto Nov
MMMM nombre mes largo Noviembre
ss segundos 16
fff milisegundos 123
tt AM/PM PM
yy año con 2 digitos 89
yyyy año con 4 digitos 1989

 


Soporte


2019 NetMentor.
Todos los derechos reservados.
Aviso legal | Politica privacidad | Politica de cookies