Sei sulla pagina 1di 10

http://www.zator.com/Cpp/E_Ce.

htm
ESTA TEORIA FUE TOMADA DE LA LIGA ANTERIOR, DEL CAPITULO CHECAR LOS PARRAFOS QUE ESTAN EN ROJO PARA LA DEV C++ 5

FECHA Y LA HORA DEL SISTEMA EN

5.5.1a Fecha y hora en la Librera Estndar C++


1 Sinopsis Las utilidades de la LE que tiene relacin con el tiempo (fecha y hora) estn definidas en el fichero de cabecera <ctime> (antiguo <time.h>) que contiene las funciones que se relacionan en la tabla adjunta. Nota: En las descripciones que siguen timestamp es un valor numrico que indica una fecha y hora expresada en segundos despus del inicio de la poca UNIX (1 de Enero de 1970 00:00:00 GMT). Funcin asctime() clock() ctime() difftime() gmtime() localtime() mktime() strftime() time() Uso Obtener una cadena alfanumrica del tipo Mon Nov 21 11:31:54 1993\n\0 a partir de una estructura tm . Obtener el tiempo transcurrido desde el comienzo de la ejecucin del programa Obtener una cadena alfanumrica del tipo sealado para asctime a partir de un timestamp. Obtener el tiempo en segundos entre dos timestamp. Obtener una fecha GMT en formato tm a partir de un timestamp con la hora local. Obtener una fecha en formato tm a partir de un timestamp. Obtener un timestamp numrico a partir de una fecha tm. Obtener una representacin alfanumrica a partir de una fecha tm (acepta un formateo similar a printf) Obtener un timestamp con la fecha y hora del Sistema.

Adems de las funciones anteriores, la STL define tres tipos simples: size_t; clock_t, time_t y una estructura tm. En realidad se trata de typedefs dependientes de la implementacin. Por ejemplo, en el fichero <time.h> del compilador Borland C++ encontramos: typedef long time_t; size_t El tipo size_t es utilizado en muchas ocasiones. Por ejemplo, es el resultado devuelto por el operador sizeof ( 4.9.13). Es un entero sin signo cuyo tipo exacto depende de la implementacin, aunque suele ser de al menos 32 bits (4 Bytes). Normalmente est definido en diversos ficheros de cabecera, entre otros <ctime>, aunque es frecuente que de una cabecera se redireccione a otra donde realmente est definido. En el caso de MS Visual C++ 6.0 y Borland C++ size_t es un tipo unsigned int ( 2.2.4). Representa el valor devuelto por la funcin clock(). En Borland C++ es un long int (2.2.4). Representa valores devueltos por las funciones time() y mktime(). En MS Visual C++ y Borland C++ es un long int ( 2.2.4).

clock_t time_t

tm

Es una estructura utilizada por diversas funciones de la Librera para almacenar informacin relativa a fecha y hora. Por ejemplo: asctime() y localtime(). Responde a la definicin siguiente: struct tm { int tm_sec; // Segundos pasados del minuto (0-61) int tm_min; // Minutos pasados de la hora (0-59) int tm_hour; // Horas desde medianoche (0-23) int tm_mday; // Dia del mes (1-31) int tm_mon; // Nmero del mes (0-11) int tm_year; // Aos transcurridos desde 1900 int tm_wday; // Dia de semana (0-6; Domingo = 0) int tm_yday; // Dia del ao (0-365) int tm_isdst; /* Adelanto de hora para horario de verano 1=Si; 0=No; -1=Indefinido */ };

2 asctime() La funcin se presenta en dos versiones: asctime para caracteres normales y _wasctime para caracteres anchos, que responden a los siguientes prototipos: #include <time.h> char* asctime(const struct tm* tmPtr); wchar_t* _wasctime(const struct tm* tmPtr); Descripcin: Ambas funciones aceptan un puntero a una estructura tipo tm , y devuelven un puntero a una cadena de caracteres con informacin alfanumrica sobre la fecha contenida en la estructura. La cadena es de ancho fijo (26 caracteres), mantiene siempre el mismo formato, y es reescrita cada vez que se invoca la funcin: Mon Nov 21 11:31:54 1993\n\0 El reloj utilizado es de 24 horas, y cualquiera que sea el tipo de caracteres utilizados (anchos o estrechos), termina en los caracteres NL (New Line) y NUL (nulo). Ejemplo: #include <iostream> using namespace std; #include <ctime> int main() { // ================== struct tm myt; myt.tm_sec = 1; myt.tm_min = 30; myt.tm_hour = 9; myt.tm_mday = 22; myt.tm_mon = 11; myt.tm_year = 56; myt.tm_wday = 4; myt.tm_yday = 0; myt.tm_isdst = 0; char* cTim = asctime(&myt)); cout << "Fecha resultante: " << cTim;

return 0; } Salida: Fecha resultante: Thu Dec 22 09:30:01 1956

3 clock() Prototipo: #include <time.h> clock_t clock(void); Descripcin: Esta funcin devuelve un valor de tipo clock_t e representa el tiempo desde el comienzo del programa hasta el momento de invocacin de la funcin. Mediante invocaciones sucesivas puede ser utilizada para obtener el tiempo entre dos puntos del programa. En caso de error, si el tiempo de proceso no est disponible o no es representable, la funcin devuelve -1. El valor devuelto representa el nmero de "tics" del RTC desde el inicio del programa. Es posible calcular este valor en segundos dividindolo por una constante denominada CLK_TCK en unos sistemas y CLOCKS_PER_SEC en otros. Definida en <ctime>. En el fichero <time.h> del compilador Borland C++ 5.5 encontramos las definiciones siguientes: #define CLOCKS_PER_SEC 1000.0 #define CLK_TCK 1000.0 Ejemplo: cout << "Desde el inicio: " << clock()/CLK_TCK << " segundos\n"; Otro ejemplo ( 9.1).

4 ctime() Esta funcin se presenta en dos versiones: ctime para caracteres normales y _wctime para caracteres anchos. Prototipos: #include <ctime> char* ctime(const time_t* sTptr); wchar_t* _wctime(const time_t* sTptr); Descripcin:

Ambas funciones aceptan un puntero a un valor time_t que supuestamente contiene un timestamp expresado en segundos despus del inicio de la poca UNIX (1 de Enero de 1970 00:00:00 GMT). Por ejemplo un valor devuelto por la funcin time(). Ambas funciones devuelven un puntero a una cadena de 26 caracteres que contiene la fecha y hora con un formato alfanumrico en el que todos los campos tienen siempre el mismo ancho, y que es reescrita cada vez que se invoca a la funcin (el reloj utilizado es de 24 horas): Mon Nov 21 11:31:54 1993\n\0 Si la fecha corresponde a un momento anterior a Enero de 1970 se obtiene una cadena nula. Ejemplo: #include <iostream> using namespace std; #include <ctime> int main() { // ================= time_t tSec = 31536000; time_t* tPtr = &tSec; char* sTptr = ctime(tPtr); cout << "Fecha: " << sTptr ; return 0; } Salida: Fecha: Fri Jan 01 01:00:00 1971

5 difftime() Prototipo: #include <time.h> double difftime(time_t time2, time_t time1); Descripcin: La funcin acepta dos valores tipo time_t y devuelve un double con el tiempo entre ambos valores expresado en segundos. Ejemplo: #include <iostream> using namespace std; #include <ctime> int main() { // =================

time_t first, second; first = time(NULL); delay(2000); // esperar 2 segundos second = time(NULL); cout << "Diferencia: " << difftime(second, first)) << " segundos\n"; return 0; }

6 gmtime() Prototipo: #include <time.h> struct tm* gmtime(const time_t* tPtr); Descripcin: La funcin acepta un puntero a un tipo time_t, que suponemos contiene una fecha local (por ejemplo, obtenida con la funcin time ), y devuelve un puntero a una estructura tipo tm que contiene la fecha convertida a la hora GMT correspondiente. Esta funcin puede ser til en un programa que maneje comunicaciones por Internet, donde es costumbre utilizar la hora GMT en vez de la hora local. Ejemplo: #include <iostream> using namespace std; #include <ctime> int main() { time_t tSac = time(NULL); // ================= // instante actual

struct tm* pt1 = localtime(&tSac); cout << "hh:mm:ss " << pt1->tm_hour << ":" << pt1->tm_min << ":" << pt1->tm_sec << endl; cout << "dd-mm-aaaa: " << pt1->tm_mday << "-" << pt1->tm_mon+1 << "-" << pt1->tm_year+1900 << endl; tm tm2 = *gmtime(&tSac); // deferencia y asignacin cout << "hh:mm:ss " << tm2.tm_hour << ":" << tm2.tm_min << ":" << tm2.tm_sec << endl;

cout << "dd-mm-aaaa: " << tm2.tm_mday << "-" << tm2.tm_mon+1 << "-" << tm2.tm_year+1900 << endl; return 0; } Salida: hh:mm:ss 22:45:2 dd-mm-aaaa: 23-5-2003 hh:mm:ss 5:45:2 dd-mm-aaaa: 24-5-2003 Comentario: Suponemos que el ordenador est situado en S. Francisco (USA), donde utilizan el horario PDT. En Mayo ya rige el horario de verano que tiene un retraso de 7 horas respecto a la hora Zul. Cuando en S. Francisco son las 22:45 del da 23, en Greenwich son las 5:45 de la madrugada del da 24. 7 localtime() Esta funcin, junto con time(), es posiblemente una de las ms tiles de entre las que se refieren a asuntos de fecha y hora. Prototipo: #include <time.h> struct tm* localtime(const time_t* timer); Descripcin: La funcin acepta un puntero a un tipo time_t, que contiene una fecha expresada en segundos desde el inicio de la poca UNIX, y devuelve un puntero a una estructura tm cuyos miembros contienen informacin sobre la fecha introducida. Sus miembros son sobre-escritos con cada invocacin a la funcin. Ejemplo: #include <iostream> using namespace std; #include <ctime> int main() { // ================= char* dS[7] = {"Domingo","Lunes","Martes","Miercoles",

"Jueves","Viernes","Sabado"}; time_t tSac = time(NULL); // instante actual struct tm* tmP = localtime(&tSac); cout << "hh:mm:ss " << tmP->tm_hour << ":" << tmP->tm_min << ":" << tmP->tm_sec << endl; cout << "dd-mm-aaaa: " << tmP->tm_mday << "-" << tmP->tm_mon+1 << "-" << tmP->tm_year+1900 << endl; cout << "Dia de semana: " << dS[tmP->tm_wday] << endl; cout << "Dia del ao: " << tmP->tm_yday << endl; cout << "Horario de verano: " << (tmP->tm_isdst ? "Si" : "No") << endl; return 0; }

VER QUE SE INCREMENTA EN 1 AL MES Y AL AO SE LE SUMA 1900 ESTO NO LO NECESITA EN BORLAND,


Salida: hh:mm:ss 11:13:23 dd-mm-aaaa: 22-5-2003 Dia de semana: Jueves Dia del ao: 141 Horario de verano: Si

8 mktime() Prototipo: #include <time.h> time_t mktime(struct tm* tmPtr); Descripcin: La funcin mktime realiza justamente la operacin inversa que la anterir localtime( ). Acepta un puntero a

una estructura tm con informacin sobre una fecha y devuelve un valor tipo time_t con el tiempo en segundos desde el inicio de la poca UNIX.

9 strftime() Esta funcin se presenta en dos versiones: strftime para caracteres normales y wcsftime para caracteres anchos. Prototipo:

#include <time.h> size_t strftime(char* str, size_t maxsize, const char* fmt, const struct tm* mPt); size_t wcsftime(wchar_t* str, size_t maxsize, const wchar_t* fmt, const struct tm* mPt); Descripcin: *[]_:;M!#$%&/()=? Como puede verse, la funcin devuelve un tipo size_t, y acepta cuatro argumentos: un puntero-a-carcter str que seala una cadena de caracteres donde se obtendr el resultado; un tipo size_t maxize; un puntero a cadena de caracteres constante fmt y un puntero mPt a una estructura tm una fecha. que suponemos contiene datos de

La funcin produce una cadena alfanumrica terminada en un carcter nulo, y la sita en el lugar sealado por str. El valor devuelto es la longitud de esta cadena incluyendo el carcter de terminacin. En caso de error, o si la longitud resulta mayor que maxsize, el valor devuelto es cero y el resultado obtenido (cadena situada en str) es indeterminado. La cadena producida es una versin de la fecha contenida en la estructura, pero formateada segn determinados cdigos de formateo que se sitan en la cadena sealada por fmt. El sistema es similar al de la conocida funcin printf() que proporciona salidas formateadas. Los cdigos permitidos son muy numerosos, de forma que puede controlarse todos los detalles de la representacin (consulte el manual de su compilador al respecto). Ejemplo: #include <iostream> using namespace std; #include <ctime> int main() { // ================= time_t tSac = time(NULL); // instante actual tm tms = *localtime(&tSac); cout << "hh:mm:ss " << tms.tm_hour << ":" << tms.tm_min << ":" << tms.tm_sec << endl; cout << "dd-mm-aaaa: " << tms.tm_mday << "-" << tms.tm_mon+1 << "-" << tms.tm_year+1900 << endl; char sRes[80]; size_t r = strftime(sRes, 80, "Son %M minutos pasados de las %I horas (%Z) %A, %B %d 20%y", &tms); if (r) cout << sRes; return 0; } Salida:

hh:mm:ss 20:14:13 dd-mm-aaaa: 24-5-2003 Son 14 minutos pasados de las 08 horas (WET) Saturday, May 24 2003

10 time() Esta funcin devuelve la hora actual del sistema en segundos desde el inicio de la poca UNIX (1 de Enero de 1970 00:00:00 GMT). Prototipo: #include <ctime> time_t time(time_t* tPtr); Descripcin: La funcin acepta un puntero a time_t y devuelve un valor time_t que es el tiempo en segundos transcurrido desde el inicio de la poca UNIX. En realidad puede realizar dos funciones: si se pasa un valor no nulo, el valor correspondiente se almacena en el sitio sealado por el puntero. Si este valor es nulo entonces el valor no se almacena en ningn sitio. En cualquier caso siempre devuelve un valor con el instante actual en segundos desde las 0 horas del 1 de Enero de 1970. Nota: Como es costumbre, si se produce un error la funcin devuelve -1. Esto puede ocurrir si el sistema no tiene reloj de tiempo real, lo que no es normal en sistemas que soporten compiladores C++. S poda ocurrir en algunos sistemas dedicados antiguos, basados en microprocesadores que disponan de compiladores C. Ejemplo: #include <iostream> using namespace std; #include <ctime> int main() { // ================= time_t t1 = 0; time_t* pt1 = &t1; time(pt1); cout << "Desde la epoca UNIX " << *pt1 << " segundos\n"; time_t t2 = time(NULL); cout << "Desde la epoca UNIX " << t2 << " segundos\n"; return 0; } Salida: Desde la epoca UNIX 1053550492 segundos Desde la epoca UNIX 1053550492 segundos

Nota: Puesto que en Borland C++ el tipo time_t es un long int cuyo rango superior es 2,147,483,647 y un ao comprende aproximadamente 31,536,000 segundos, el lmite superior se alcanzar algo ms de 68 aos despus de Enero de 1970 (el 18 de Enero del ao 2038). Por esta razn muchos fabricantes estn empezando a utilizar tipos de 64 bits para este typedef.

OTRA LIGA DONDE PUEDEN VER Y COPIAR TEORIA Y PROGRAMAS EN C++ http://c.conclase.net/curso/index.php

|123!#!#$%&/()=?\