Foros del Web » Programación para mayores de 30 ;) » C/C++ »

Trabajar con fechas en C

Estas en el tema de Trabajar con fechas en C en el foro de C/C++ en Foros del Web. Buenas Noches! He revisado su foro y creo que es el sitio perfecto para mi duda. Antes de nada, he estado buscando en el foro ...
  #1 (permalink)  
Antiguo 23/01/2015, 19:33
 
Fecha de Ingreso: enero-2015
Mensajes: 7
Antigüedad: 9 años, 3 meses
Puntos: 0
Trabajar con fechas en C

Buenas Noches!
He revisado su foro y creo que es el sitio perfecto para mi duda. Antes de nada, he estado buscando en el foro algún post en el que aparezcan las normas del foro por si me cuelo al abrir este post para mi duda, pero no he encontrado nada por lo que espero que no incumpla nada ya desde el primer día jeje.

Mi duda es la siguiente, estoy realizando un programa en C en el que necesito trabajar con fechas. Sí, sé que se puede extraer la fecha actual del ordenador, eso ya lo he visto en bastantes sitios. El problema se da, cuando necesito comparar ciertas fechas. Por ejemplo, tengo dos fechas, el 18-01-2015 la cual la he extraido de un fichero de texto y por otra parte la que me extraería el programa del ordenador a día de hoy 24-01-2015. Necesito trabajar con la diferencia de: Hace X días, en este caso 6 días. Evidentemente con este ejemplo no habría problema, pero sí lo habría si comparamos dos fechas de meses distintos y aún más de años distintos. ¿Habría alguna forma para que al comparar dos fechas me diga la diferencia de días? Tampoco necesitaría trabajar con fechas de 1980, me vale con Octubre del año pasado.
Un Saludo!
  #2 (permalink)  
Antiguo 23/01/2015, 23:14
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Trabajar con fechas en C

Este te calcula los años bisiesto. Esta por toda la red XD

Código C:
Ver original
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <ctype.h>
  5.  
  6. struct Fecha {
  7.     int dia;
  8.     int mes;
  9.     int anio;
  10. };
  11.  
  12. //función que calcula si es bisiesto un año
  13. int bisiesto ( int anio ) {
  14.     if ( anio % 400 == 0 || ( anio % 4 == 0 && anio % 100 != 0 ) ) return 1;
  15.     else return 0;
  16. }
  17.  
  18. //función que Calcula los días de un mes
  19. int dias_mes ( struct Fecha fecha ) {
  20.     switch ( fecha.mes ) {
  21.         case 1:
  22.         case 3:
  23.         case 5:
  24.         case 7:
  25.         case 8:
  26.         case 10:
  27.         case 12:
  28.             return 31;
  29.             break;
  30.            
  31.         case 4:
  32.         case 6:
  33.         case 9:
  34.         case 11:
  35.             return 30;
  36.             break;
  37.            
  38.         case 2:
  39.             if ( bisiesto ( fecha.anio ) )
  40.                 return 29;
  41.             else
  42.                 return 28;
  43.     }
  44.    
  45.     return 0;
  46. }
  47.  
  48. //informa los días que hay entre dos fechas.
  49. int cuenta_dias ( struct Fecha fecha1, struct Fecha fecha2 ) {
  50.     int acum = 0;
  51.    
  52.     while ( 1 ) {
  53.         if ( fecha1.anio == fecha2.anio && fecha1.mes == fecha2.mes )
  54.             break;
  55.            
  56.         acum = acum + ( dias_mes ( fecha1 ) - fecha1.dia );
  57.        
  58.         if ( fecha1.mes == 12 ) {
  59.             fecha1.mes = 1;
  60.             fecha1.anio++;
  61.         } else
  62.             fecha1.mes++;
  63.            
  64.         fecha1.dia = 0;
  65.     }
  66.    
  67.     acum = acum + ( fecha2.dia - fecha1.dia );
  68.     return acum;
  69. }
  70.  
  71. int main() {
  72.     Fecha fecha1, fecha2;
  73.     fecha1.dia = 8;
  74.     fecha1.mes = 2;
  75.     fecha1.anio = 2012;
  76.     fecha2.dia = 18;
  77.     fecha2.mes = 2;
  78.     fecha2.anio = 2012;
  79.    
  80.    
  81.     printf ( "%d dias de diferencia entre ambas fechas.\n", cuenta_dias ( fecha1, fecha2 ) );
  82.     return 0;
  83. }
  #3 (permalink)  
Antiguo 24/01/2015, 15:40
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Trabajar con fechas en C

Pudiendo usar C++11:

Código C++:
Ver original
  1. #include <iostream>
  2. #include <ctime>
  3. #include <ratio>
  4. #include <chrono>
  5.  
  6. int main ()
  7. {
  8.     std::tm timeinfo = std::tm();
  9.  
  10.     timeinfo.tm_mday = 18;   // 18
  11.     timeinfo.tm_mon = 0;     // enero
  12.     timeinfo.tm_year = 115;  // 2015
  13.  
  14.     auto t_x = std::mktime(&timeinfo);
  15.     auto tp_x = std::chrono::system_clock::from_time_t(t_x);
  16.     auto tp_hoy = std::chrono::system_clock::now();
  17.     auto diferencia = tp_hoy - tp_x;
  18.  
  19.     const int SEGS_POR_DIA = 60*60*24;
  20.     typedef std::chrono::duration<int,std::ratio<SEGS_POR_DIA>> dias_t;
  21.     int n_dias = std::chrono::duration_cast<dias_t>(diferencia).count();
  22.  
  23.     std::cout << n_dias << " dias desde el 18-01-2015" << std::endl;
  24.  
  25.     return 0;
  26. }
  #4 (permalink)  
Antiguo 25/01/2015, 11:39
 
Fecha de Ingreso: enero-2015
Mensajes: 7
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Trabajar con fechas en C

Muchas Gracias a ambos!
Muchas Gracias por tu código vangodp, sabía que con paciencia sacar se podía sacar algo, pero tenía la duda de si había algo en alguna biblioteca más reducido para trabajar con fechas, pero el C es así, muchas gracias por el código, ahora mismo lo añado al programa!
Y Muchas Gracias lareto, lamentablemente todavía no he estudiado C++ pero a la vista está que es justo lo que pensaba que podría existir en C, un código más reducido. Me lo guardo por si algún día mi programa lo puedo implementar en este lenguaje!
Un Saludo
  #5 (permalink)  
Antiguo 25/01/2015, 12:38
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Trabajar con fechas en C

En cualquier compilador decente de C puedes usar:
Código C:
Ver original
  1. #include <time.h>
  2. #include <stdio.h>
  3. #include <string.h>
  4.  
  5. int main(void)
  6. {
  7.     struct tm start_time;
  8.     struct tm end_time;
  9.  
  10.     memset(&start_time, 0, sizeof(struct tm));
  11.     memset(&end_time, 0, sizeof(struct tm));
  12.  
  13.     strptime("2015-01-18", "%Y-%m-%d", &start_time);
  14.     strptime("2015-01-24", "%Y-%m-%d", &end_time);
  15.  
  16.     double seconds = difftime(mktime(&end_time), mktime(&start_time));
  17.     printf("%.2lf\n", seconds / (3600*24));
  18.  
  19.     return 0;
  20. }
  #6 (permalink)  
Antiguo 25/01/2015, 16:25
 
Fecha de Ingreso: enero-2015
Mensajes: 7
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Trabajar con fechas en C

Pues el CodeBlocks no será uno de esos jaja Me da error con los "strptime".
Muchas Gracias de todas formas!
Un Saludo
  #7 (permalink)  
Antiguo 25/01/2015, 20:15
Avatar de razpeitia
Moderador
 
Fecha de Ingreso: marzo-2005
Ubicación: Monterrey, México
Mensajes: 7.321
Antigüedad: 19 años, 1 mes
Puntos: 1360
Respuesta: Trabajar con fechas en C

O_O me sorprende lo fácil que se da por vencido y la poca habilidad para interpretar código de las nuevas generaciones.

strptime solo es una función que le asigna los valores correctos a la estructura que le pases.


Código C:
Ver original
  1. // strptime("2015-01-18", "%Y-%m-%d", &start_time);
  2. start_time.tm_mday = 18; start_time.tm_mon = 0; start_time.tm_year = 115;
  3.  
  4. // strptime("2015-01-24", "%Y-%m-%d", &end_time);
  5. end_time.tm_mday = 24; end_time.tm_mon = 0; end_time.tm_year = 115;
  #8 (permalink)  
Antiguo 26/01/2015, 14:50
 
Fecha de Ingreso: enero-2015
Mensajes: 7
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Trabajar con fechas en C

Jajaja lo siento! Estoy estudiando primero de carrera y conozco lo más básico de C, por lo que no conozco las posibilidades de este y por esos recurro a ustedes. Probaré con lo que me has pasado y ya te comentaré. Muchas Gracias!
Un Saludo
  #9 (permalink)  
Antiguo 26/01/2015, 19:43
Avatar de vangodp  
Fecha de Ingreso: octubre-2013
Mensajes: 934
Antigüedad: 10 años, 7 meses
Puntos: 38
Respuesta: Trabajar con fechas en C

Cita:
Pues el CodeBlocks no será uno de esos jaja Me da error con los "strptime".
Muchas Gracias de todas formas!
Un Saludo
Codeblocks no es tan malo asi. Y la solucion de razpeitia tampoco es mala, y además muy compacta solución, hazta me la apunto yo
  #10 (permalink)  
Antiguo 27/01/2015, 01:53
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Trabajar con fechas en C

Cita:
Iniciado por DMM3 Ver Mensaje
Pues el CodeBlocks no será uno de esos jaja Me da error con los "strptime".
Muchas Gracias de todas formas!
Un Saludo
strptime no es una función estándar. Hasta donde llego, únicamente está disponible en las distribuciones Linux/Unix.

Si la quieres usar en Windows, puedes ver su implementación en este enlace
  #11 (permalink)  
Antiguo 27/01/2015, 17:22
 
Fecha de Ingreso: enero-2015
Mensajes: 7
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Trabajar con fechas en C

Muchas Gracias a ambos por contestar! La solución de razpeitia probablemente sea la más rentable debido a lo compacta que es, pero de momento creo que utilizaré la de vangodp dado que es la que entiendo con mi nivel de conocimiento de C. Tengo muchas ganas de aprender y sé que por aquí aprenderé mucho, así que me guardo todas las respuestas.

Por cierto, una duda muy rápida ya por curiosidad, como ya he dicho estoy en primero de carrera, y en programación nos dejaron muy claro y han hecho mucho hincapié en que nunca salgamos de los bucles con "break;" sino que siempre sea debido a la condición. Es decir, qué diferencias habría entre este bucle de vangodp:
Código c:
Ver original
  1. while ( 1 ) {
  2.         if ( fecha1.anio == fecha2.anio && fecha1.mes == fecha2.mes )
  3.             break;
  4. ...
  5. }
Y este modificado por mí:
Código c:
Ver original
  1. while ( fecha1.anio != fecha2.anio || fecha1.mes != fecha2.mes ){
  2. ....
  3. }
Un Saludo y Muchas Gracias a todos.
  #12 (permalink)  
Antiguo 27/01/2015, 21:06
lareto
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: Trabajar con fechas en C

Cita:
Iniciado por DMM3 Ver Mensaje
...han hecho mucho hincapié en que nunca salgamos de los bucles con "break;"...
break es una palabra clave del lenguaje.

Las características del lenguaje están ahí para ser usadas, y muchas veces se elijen porque hacen al código más eficiente, o más inteligible, o más elegante; depende de cada caso.

Si el que ha cometido el incapié tiene los suficientes kilates como para corregir al comité estándar, puede merecer que se lo escuche; de lo contrario es él el que está equivocado. ¿Tú qué crees?
  #13 (permalink)  
Antiguo 27/01/2015, 21:44
 
Fecha de Ingreso: enero-2015
Mensajes: 7
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Trabajar con fechas en C

Me resulta cuanto menos curioso. Desde mi posición, un alumno que acaba empezar desde 0 en programación, mira a su profesor de universidad con admiración, y grabas en la mente palabra por palabra lo que dice.
Podrían ser suficientes kilates los de un profesor de universidad, el cual está enseñando a futuros profesionales, pero la controversia aparece cuando, en otro turno de clases con distintos profesores enseñan este lenguaje usando la técnica del break para salir del bucle, otros profesores de la misma universidad, técnicamente los mismos kilates que los primeros. Ahí saltan mis dudas y necesito pedir opinión desde fuera, ideal en este foro. Además cabe resaltar, que en los exámenes ponía explícitamente que estaba prohibido usar esa técnica para salir del bucle.
Un Saludo!
  #14 (permalink)  
Antiguo 28/01/2015, 00:50
 
Fecha de Ingreso: octubre-2014
Ubicación: Madrid
Mensajes: 1.212
Antigüedad: 9 años, 7 meses
Puntos: 204
Respuesta: Trabajar con fechas en C

Seguramente te digan lo del "break" para que no abuses de ello y te acostumbres a usar otras estructuras.

La ventaja de no usar un break para salir de un bucle es que, a la hora de depurar, únicamente te hace falta un punto de parada en el bucle para poder evaluarlo... si resulta que un bucle tiene 10 breaks necesitas al menos 10 puntos de parada para poder depurar el bucle de forma rápida. Ahora bien, ni es mejor usar SIEMPRE break, ni tampoco es mejor usar SIEMPRE un condicional para salir, de hecho, generalmente las dos opciones son igual de buenas y todo depende de una serie de factores:

* Legibilidad: Para mí lo más importante, si el código no se entiende a simple vista tenemos un problema.
* Rendimiento: En entornos más o menos críticos un break suele dar mejores resultados que un condicional, pero como norma general esto es imperceptible.

Un saludo.
  #15 (permalink)  
Antiguo 31/01/2015, 08:21
 
Fecha de Ingreso: enero-2015
Mensajes: 7
Antigüedad: 9 años, 3 meses
Puntos: 0
Respuesta: Trabajar con fechas en C

Pues me alegro de haberlo preguntado, quería una opinión exterior más abierta que el "está terminantemente prohibido salir de los bucles con break". Indudablemente, si en la universidad me lo exigen de esta manera lo realizaré como ellos me indican, pero al menos lo tendré en cuenta de que no sólo su manera es la única válida y que existe este recurso con la misma validez.
Muchas Gracias y Un Saludo!

Etiquetas: programa
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:38.