C++ Fecha y hora
Fecha y hora (Date y Time)
La biblioteca <ctime>
nos permite trabajar con fechas y horas.
Para usarlo, debes importar el archivo de encabezado <ctime>
:
Ejemplo
#include <ctime> // Importar la biblioteca ctime
Mostrar fecha y hora actuales
La biblioteca <ctime>
tiene una variedad de funciones para medir fechas y horas.
La función time()
nos proporciona una marca de tiempo que representa la fecha y hora actuales. Podemos usar la función ctime()
para mostrar la fecha y hora que representa una marca de tiempo:
Ejemplo
Mostrar la fecha actual:
// Obtener la marca de tiempo para la fecha y hora actuales
time_t timestamp;
time(×tamp);
// Mostrar la fecha y hora representadas por la marca de tiempo
cout << ctime(×tamp);
Inténtalo tú mismo »
Dos formas de utilizar la función time()
La función time()
escribe una marca de tiempo en la ubicación de memoria proporcionada por el parámetro, pero también devuelve el valor de la marca de tiempo.
Una forma alternativa de utilizar la función time()
es pasar un puntero NULL y utilizar el valor de retorno en su lugar.
time_t timestamp = time(NULL);
Tipos de datos
Hay dos tipos de datos diferentes que se utilizan para almacenar la fecha y la hora: time_t
para marcas de tiempo y struct tm
para estructuras de fecha y hora.
Las marcas de tiempo representan un momento en el tiempo como un único número, lo que facilita que la computadora realice cálculos.
Estructuras de fecha y hora son estructuras que representan diferentes componentes de la fecha y la hora como miembros. Esto nos facilita especificar fechas. Las estructuras de fecha y hora tienen los siguientes miembros:
tm_sec
- Los segundos dentro de un minutotm_min
- Los minutos dentro de una horatm_hour
- La hora dentro de un día (de 0 a 23)tm_mday
- El día del mestm_mon
- El mes (del 0 al 11 a partir de enero)tm_year
- El número de años desde 1900tm_wday
- El día de la semana (de 0 a 6 a partir del domingo)tm_yday
- El día del año (de 0 a 365, siendo 0 el 1 de enero)tm_isdst
- Positivo cuando el horario de verano está vigente, cero cuando no está vigente y negativo cuando se desconoce
Tenga siempre en cuenta la forma en que se representan los componentes de fecha:
- Las horas se representan en formato de 24 horas. Las 11 p. m. se representarían como 23.
- Los meses van del 0 al 11. Por ejemplo, diciembre se representaría como 11 en lugar de 12.
- Los años se representan en relación con el año 1900. El año 2024 se representaría como 124 porque han pasado 124 años desde 1900.
Creación de marcas de tiempo
La función time()
solo puede crear una marca de tiempo para la fecha actual, pero podemos crear una marca de tiempo para cualquier fecha usando mktime()
función.
La función mktime()
convierte una estructura de fecha y hora en una marca de tiempo.
Ejemplo
Cree una marca de tiempo usando la función mktime()
:
struct tm datetime;
time_t timestamp;
datetime.tm_year = 2023 - 1900; // Número de años desde 1900
datetime.tm_mon = 12 - 1; // Número de meses desde enero
datetime.tm_mday = 17;
datetime.tm_hour = 12;
datetime.tm_min = 30;
datetime.tm_sec = 1;
// Se debe especificar el horario de verano
// -1 usa la configuración de zona horaria de la computadora
datetime.tm_isdst = -1;
timestamp = mktime(&datetime);
cout << ctime(×tamp);
Inténtalo tú mismo »
Nota: La función mktime()
necesita que estos miembros tengan un valor: tm_year
, tm_mon
, tm_mday
, tm_hour
, tm_min
, tm_sec
y tm_isdst
.
Creando estructuras de fecha y hora
La función mktime()
también completa los campos tm_wday
y tm_yday
miembros de la estructura de fecha y hora con los valores correctos, lo que completa la estructura y proporciona una fecha y hora válida. Se puede utilizar, por ejemplo, para encontrar el día de la semana de una fecha determinada:
Ejemplo
Encuentre el día de la semana de una fecha específica:
// Cree la estructura de fecha y hora y use mktime para completar los miembros que faltan
struct tm datetime;
datetime.tm_year = 2023 - 1900; // Número de años desde 1900
datetime.tm_mon = 12 - 1; // Número de meses desde enero
datetime.tm_mday = 17;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
string weekdays[] = {"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"};
cout << "The date is on a " << weekdays[datetime.tm_wday];
Inténtalo tú mismo »
Las funciones localtime()
y gmtime()
pueden convertir marcas de tiempo en estructuras de fecha y hora.
La función localtime()
devuelve un puntero a una estructura que representa la hora en la zona horaria de la computadora.
La función gmtime()
devuelve un puntero a una estructura que representa la hora en la zona horaria GMT.
Estas funciones devuelven un puntero a una estructura de fecha y hora. Si queremos asegurarnos de que su valor no cambie inesperadamente, debemos hacer una copia eliminando la referencia al puntero. Para obtener más información sobre la desreferenciación, consulte la página Desreferenciación de C++.
Ejemplo
Obtenga una estructura de fecha y hora y genere la hora actual:
time_t timestamp = time(×tamp);
struct tm datetime = *localtime(×tamp);
cout << datetime.tm_hour;
Inténtalo tú mismo »
Mostrar fechas
Hasta ahora hemos estado usando la función ctime()
para mostrar la fecha contenida en una marca de tiempo. Para mostrar fechas de una estructura de fecha y hora, podemos usar la función asctime()
.
Ejemplo
Mostrar la fecha representada por una estructura de fecha y hora:
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
cout << asctime(&datetime);
Inténtalo tú mismo »
Nota: La función asctime()
no corrige fechas no válidas. Por ejemplo, si configura el día del mes en 32, mostrará 32. La función mktime()
puede corregir este tipo de errores:
Ejemplo
Corregir una fecha antes de mostrarla:
// Cree la estructura de fecha y hora y use mktime para corregir errores
struct tm datetime;
datetime.tm_year = 2022 - 1900; // Número de años desde 1900
datetime.tm_mon = 0; // 0 es enero
datetime.tm_mday = 32;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.tm_isdst = -1;
mktime(&datetime);
cout << asctime(&datetime);
Inténtalo tú mismo »
Las funciones ctime()
y asctime()
nos permiten mostrar la fecha, pero no nos permiten para elegir cómo se muestra.
Para elegir cómo se muestra una fecha, podemos usar la función strftime()
.
Ejemplo
Representar la fecha actual de diferentes maneras:
time_t timestamp = time(NULL);
struct tm datetime = *localtime(×tamp);
char output[50];
strftime(output, 50, "%B %e, %Y", &datetime);
cout << output << "\n";
strftime(output, 50, "%I:%M:%S %p", &datetime);
cout << output << "\n";
strftime(output, 50, "%m/%d/%y", &datetime);
cout << output << "\n";
strftime(output, 50, "%a %b %e %H:%M:%S %Y", &datetime);
cout << output << "\n";
Inténtalo tú mismo »
La función strftime()
formatea una fecha y la escribe como una cadena de estilo C en una matriz char
. Tiene cuatro parámetros:
- El primer parámetro apunta a la matriz de caracteres donde se escribirá la fecha formateada.
- El segundo parámetro especifica el espacio disponible en la matriz.
- El tercer parámetro nos permite elegir cómo se formatea la fecha usando especificadores de formato.
- El último parámetro es un puntero a la estructura de fecha y hora que contiene la fecha que queremos mostrar.
La siguiente tabla tiene algunos especificadores de formato útiles. Para obtener una lista más completa, consulte la página de referencia de strftime().
Especificador de formato | Descripción | Ejemplo |
---|---|---|
%a |
Breve representación del día de la semana | Fri |
%b |
Breve representación del nombre del mes | Dec |
%B |
Representación completa del nombre del mes | December |
%d |
Día del mes con cero a la izquierda | 09 |
%e |
Día del mes con espacios destacados | 9 |
%H |
Formato de 24 horas de una hora | 14 |
%I |
Formato de 12 horas de una hora | 02 |
%M |
Minutos en una hora | 30 |
%p |
AM o PM | PM |
%S |
Segundos en un minuto | 01 |
%y |
Representación del año de 2 dígitos | 23 |
%Y |
Representación del año de 4 dígitos | 2023 |
Medir el tiempo
Hay dos funciones diferentes que se pueden utilizar para medir diferencias en el tiempo.
La función difftime()
mide el número de segundos que pasaron entre dos marcas de tiempo diferentes. Esto es útil al medir diferencias horarias entre fechas.
Ejemplo
Mida la diferencia horaria entre dos marcas de tiempo
time_t now;
time_t nextyear;
struct tm datetime;
now = time(NULL);
datetime = *localtime(&now);
datetime.tm_year = datetime.tm_year + 1;
datetime.tm_mon = 0;
datetime.tm_mday = 1;
datetime.tm_hour = 0; datetime.tm_min = 0; datetime.tm_sec = 0;
datetime.is_dst = -1;
nextyear = mktime(&datetime);
int diff = difftime(nextyear, now);
cout << diff << " segundos hasta el año que viene";
Inténtalo tú mismo »
La función reloj()
es útil para medir intervalos cortos de tiempo mientras el programa se está ejecutando. Es más precisa que la función difftime()
.
Cada llamada a la función de reloj devuelve un tipo especial de marca de tiempo medida en relojes (una unidad de tiempo que depende de cómo se implementó la biblioteca) que tiene un tipo de datos clock_t
. Para medir una diferencia horaria, almacene una marca de tiempo en dos momentos diferentes y luego réstelos. La diferencia horaria se mide en relojes, pero puedes convertirla en segundos dividiéndola por la constante CLOCKS_PER_SEC
.
Ejemplo
Mide cuánto tiempo tarda en ejecutarse el programa:
clock_t before = clock();
int k = 0;
for(int i = 0; i < 100000; i++) {
k += i;
}
clock_t duration = clock() - before;
cout << "Duración: " << (float)duration / CLOCKS_PER_SEC << " seconds";
Inténtalo tú mismo »
Nota: asegúrese de convertir el valor a un tipo float
o double
antes de dividir; de lo contrario, puede resultar en una división de números enteros que provocaría que se corte la parte decimal.
<ctime> Referencia completa
Para obtener una referencia completa de las funciones <ctime>, vaya a nuestra Referencia de C++ ctime.