[C con Clase] Fecha de nacimiento

Salvador Pozo salvador en conclase.net
Jue Dic 29 10:59:48 CET 2011


El pasado 2011-12-28 23:32:20, Alejandro Fernández escribió:
 
AF> Hola, amigos, tengo un problemilla, necesito hacer un programa en C++,
AF> dado la fecha del 1er dia del ultimo ciclo menstrual saber la fecha exacta
AF> del nacimiento del bebe, se conoce que deben ser a partir de esa fecha 40
AF> semanas. 
AF> por ejemplo:
AF> 01232009 ---- para este da 10/30/2009
AF> 01232008 ---- 10/29/2008  por ser bisiesto 2008
AF> debe existir alguna clase en C++ como java, que se le pasen estos datos y
AF> nos devuelva la fecha que quiero????, alguna idea???

Hola:

No existe esa clase, C++ no te da tantas facilidades como Java, no todo está hecho. :)

Puedes usar funciones de la biblioteca estándar de C: time.

La idea de trabajar con estas funciones y tipos es siempre similar.

Disponemos de dos tipos:

struct tm: una estructura de "tiempo separado", en la que hay campos para cada elemento de la fecha: año, mes, día, hora, minuto, segundo...
time_t: un número entero que codifica una fecha como los segundos transcurridos desde (si no recuerdo mal), el 1 de enero de 1970.

Dos funciones:
mktime: que convierte tiempos del formato struct tm a time_t.
localtime: que convierte tiempos del formato time_t a struct tm.

Las fechas son más fáciles de manejar en formato de tiempo separado, podemos asignar una fecha concreta o visualizarla.

Las operaciones de suma y diferencia de tiempos son más simples en formato condensado.

El proceso, en tu caso, es simple:
 - Usamos una variable struct tm para asignar la fecha inicial.
 - La convertimos a un valor time_t.
 - Le sumamos el número de segundos equivalente a 40 semanas.
 - Convertimos de nuevo el valor obtenido a struct tm.
 - Visualizamos o trabajamos con el resultado obtenido.

Algunos detalles a tener en cuenta:
a) En struct tm los años se codifican restanto 1900. El año 2000, por ejemplo, es 100.
b) En struct tm, los meses se codifican empezando en 0, enero es 0 y diciembre es 11.
c) Hay un campo en struct tm (tm_isdst), que indica si se activa el horario de verano/invierno para ahorro de energía. Para nuestro caso conviene desactivarlo (usar el valor 0), ya que puede darnos un error de un día, sobre todo si usamos como hora para nuestras fechas las 00:00:00.
d) La función localtime devuelve un puntero a una estructura tm, cuidado con este detalle.

Por último, un ejemplo. (Espero no estar haciendo tu tarea, si es así, intenta hacerla sin mirarlo). o:)

----8<------
#include <iostream>
#include <ctime>

using namespace std;

int main()
{
    tm fechaC;
    tm *fechaN;
    time_t timeC;

    fechaC.tm_year = 2009-1900;
    fechaC.tm_mon = 0; // Enero
    fechaC.tm_mday = 23;
    fechaC.tm_hour = fechaC.tm_min = fechaC.tm_sec = 0;
    fechaC.tm_isdst = 0;
    timeC = mktime(&fechaC);

    timeC += 40 * 7 * 24 * 60 * 60; // + 40 semanas

    fechaN = localtime( &timeC );
    cout << fechaN->tm_mday << "/" << fechaN->tm_mon+1 << "/" <<
            fechaN->tm_year+1900 << endl;
    return 0;
}
----8<------

Hasta pronto.

-- 
Salvador Pozo (Administrador)
mailto:salvador en conclase.net


Más información sobre la lista de distribución Cconclase