462 votos

¿Cómo obtener la hora y la fecha actuales en C++?

¿Existe una forma multiplataforma de obtener la fecha y hora actuales en C++?

709voto

Frederick The Fool Puntos 9092

En C++ 11 se puede utilizar std::chrono::system_clock::now()

Ejemplo (copiado de es.cppreference.com ):

#include <iostream>
#include <chrono>
#include <ctime>    

int main()
{
    auto start = std::chrono::system_clock::now();
    // Some computation here
    auto end = std::chrono::system_clock::now();

    std::chrono::duration<double> elapsed_seconds = end-start;
    std::time_t end_time = std::chrono::system_clock::to_time_t(end);

    std::cout << "finished computation at " << std::ctime(&end_time)
              << "elapsed time: " << elapsed_seconds.count() << "s\n";
}

Esto debería imprimir algo así:

finished computation at Mon Oct  2 00:59:08 2017
elapsed time: 1.88232s

507voto

C++ comparte sus funciones de fecha/hora con C. El estructura tm es probablemente la más fácil de trabajar para un programador de C++ - lo siguiente imprime la fecha de hoy:

#include <ctime>
#include <iostream>

int main() {
    std::time_t t = std::time(0);   // get time now
    std::tm* now = std::localtime(&t);
    std::cout << (now->tm_year + 1900) << '-' 
         << (now->tm_mon + 1) << '-'
         <<  now->tm_mday
         << "\n";
}

182voto

TrungTN Puntos 916

Puedes probar el siguiente código multiplataforma para obtener la fecha/hora actual:

#include <iostream>
#include <string>
#include <stdio.h>
#include <time.h>

// Get current date/time, format is YYYY-MM-DD.HH:mm:ss
const std::string currentDateTime() {
    time_t     now = time(0);
    struct tm  tstruct;
    char       buf[80];
    tstruct = *localtime(&now);
    // Visit http://en.cppreference.com/w/cpp/chrono/c/strftime
    // for more information about date/time format
    strftime(buf, sizeof(buf), "%Y-%m-%d.%X", &tstruct);

    return buf;
}

int main() {
    std::cout << "currentDateTime()=" << currentDateTime() << std::endl;
    getchar();  // wait for keyboard input
}

La salida:

currentDateTime()=2012-05-06.21:47:59

Visite aquí para más información sobre el formato fecha/hora

139voto

Loki Astari Puntos 116129

Las bibliotecas std C proporcionan time() . Se trata de segundos de la época y se puede convertir en fecha y H:M:S utilizando las funciones estándar de C. Impulsar también tiene una biblioteca de hora/fecha que puedes comprobar.

time_t  timev;
time(&timev);

32voto

Howard Hinnant Puntos 59526

Nueva respuesta para una vieja pregunta:

La pregunta no especifica en qué zona horaria. Hay dos posibilidades razonables:

  1. En UTC.
  2. En la zona horaria local del ordenador.

Para 1, puede utilizar esta fecha biblioteca y el siguiente programa:

#include "date.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    std::cout << system_clock::now() << '\n';
}

Que acaba de salir para mí:

2015-08-18 22:08:18.944211

La librería de fechas esencialmente sólo añade un operador de flujo para std::chrono::system_clock::time_point . También añade muchas otras funcionalidades agradables, pero que no se utilizan en este sencillo programa.

Si prefiere el 2 (la hora local), hay un biblioteca de zonas horarias que se construye sobre el biblioteca de fechas . Ambas bibliotecas son código abierto y plataforma cruzada suponiendo que el compilador soporte C++11 o C++14.

#include "tz.h"
#include <iostream>

int
main()
{
    using namespace date;
    using namespace std::chrono;
    auto local = make_zoned(current_zone(), system_clock::now());
    std::cout << local << '\n';
}

Lo que para mí es sólo la salida:

2015-08-18 18:08:18.944211 EDT

El tipo de resultado de make_zoned es un date::zoned_time que es un emparejamiento de un date::time_zone y un std::chrono::system_clock::time_point . Este par representa una hora local, pero también puede representar UTC, dependiendo de cómo se consulte.

Con la salida anterior, se puede ver que mi ordenador está actualmente en una zona horaria con un desplazamiento UTC de -4h, y una abreviatura de EDT.

Si se desea otra zona horaria, también se puede conseguir. Por ejemplo, para encontrar la hora actual en Sidney, Australia, basta con cambiar la construcción de la variable local a:

auto local = make_zoned("Australia/Sydney", system_clock::now());

Y la salida cambia a:

2015-08-19 08:08:18.944211 AEST

Actualización para C++20

Esta biblioteca se ha adoptado en gran medida para C++20. El espacio de nombres date ha desaparecido y todo está en el espacio de nombres std::chrono ahora. Y usa zoned_time en lugar de make_time . Deja las cabeceras "date.h" y "tz.h" y sólo usar <chrono> .

#include <chrono>
#include <iostream>

int
main()
{
    using namespace std::chrono;
    auto local = zoned_time{current_zone(), system_clock::now()};
    std::cout << local << '\n';  // 2021-05-03 15:02:44.130182 EDT
}

Mientras escribo esto, están empezando a surgir implementaciones parciales en algunas plataformas.

Iteramos.com

Iteramos es una comunidad de desarrolladores que busca expandir el conocimiento de la programación mas allá del inglés.
Tenemos una gran cantidad de contenido, y también puedes hacer tus propias preguntas o resolver las de los demás.

Powered by:

X