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

¿Hay una forma de plataforma cruzada para obtener la fecha y hora actual en C ++?

En C ++ 11 puedes usar std::chrono::system_clock::now()

C ++ comparte sus funciones de fecha / hora con C. La estructura de tm es probablemente la más fácil de usar para un progtwigdor de C ++; la siguiente fecha de hoy es la siguiente:

 #include  #include  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"; } 

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

 #include  #include  #include  #include  

Salida:

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

Por favor visite aquí para más información sobre el formato de fecha / hora

Las bibliotecas estándar C proporcionan time() . Esto es segundos de la época y se puede convertir a la fecha y H:M:S usando funciones C estándar. Boost también tiene una biblioteca de hora / fecha que puedes verificar.

 time_t timev; time(&timev); 

la biblioteca estándar de C ++ no proporciona un tipo de fecha apropiado. C ++ hereda las estructuras y funciones para la manipulación de fecha y hora desde C, junto con un par de funciones de entrada y salida de fecha / hora que tienen en cuenta la localización.

 // Current date/time based on current system time_t now = time(0); // Convert now to tm struct for local timezone tm* localtm = localtime(&now); cout < < "The local date and time is: " << asctime(localtm) << endl; // Convert now to tm struct for UTC tm* gmtm = gmtime(&now); if (gmtm != NULL) { cout << "The UTC date and time is: " << asctime(gmtm) << endl; } else { cerr << "Failed to get the UTC date and time" << endl; return EXIT_FAILURE; } 

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 de la computadora.

Para 1, puede usar esta biblioteca de fechas y el siguiente progtwig:

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

Que me acaba de dar salida:

 2015-08-18 22:08:18.944211 

La biblioteca de fechas básicamente solo agrega un operador de streaming para std::chrono::system_clock::time_point . También agrega muchas otras funciones agradables, pero eso no se usa en este progtwig simple.

Si prefiere 2 (la hora local), hay una biblioteca de zona horaria que se crea sobre la biblioteca de fechas . Ambas bibliotecas son de código abierto y plataforma cruzada , suponiendo que el comstackdor sea compatible con C ++ 11 o C ++ 14.

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

Lo cual para mí solo salió:

 2015-08-18 18:08:18.944211 EDT 

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

Con el resultado anterior, puede ver que mi computadora se encuentra actualmente en una zona horaria con un desplazamiento UTC de -4h y una abreviatura de EDT.

Si se desea alguna otra zona horaria, eso también se puede lograr. Por ejemplo, para encontrar la hora actual en Sydney, Australia simplemente cambie la construcción de la variable local a:

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

Y el resultado cambia a:

 2015-08-19 08:08:18.944211 AEST 

(Para compañeros googlers)

También hay Boost :: date_time :

 #include  boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time(); 
 #include  #include  

Sí y puede hacerlo con las reglas de formato especificadas por la configuración regional actualmente imbuida:

 #include  #include  #include  class timefmt { public: timefmt(std::string fmt) : format(fmt) { } friend std::ostream& operator < <(std::ostream &, timefmt const &); private: std::string format; }; std::ostream& operator <<(std::ostream& os, timefmt const& mt) { std::ostream::sentry s(os); if (s) { std::time_t t = std::time(0); std::tm const* tm = std::localtime(&t); std::ostreambuf_iterator out(os); std::use_facet>(os.getloc()) .put(out, os, os.fill(), tm, &mt.format[0], &mt.format[0] + mt.format.size()); } os.width(0); return os; } int main() { std::cout < < timefmt("%c"); } 

Salida: Fri Sep 6 20:33:31 2013

 auto time = std::time(nullptr); std::cout < < std::put_time(std::localtime(&time), "%F %T%z"); // ISO 8601 format. 

Obtenga la hora actual ya sea usando std::time() o std::chrono::system_clock::now() (u otro tipo de reloj ).

std::put_time() (C ++ 11) y strftime() (C) ofrecen muchos formateadores para generar esos tiempos.

 #include  #include  int main() { auto time = std::time(nullptr); std::cout // ISO 8601: %Y-%m-%d %H:%M:%S, eg 2017-07-31 00:42:00+0200. < < std::put_time(std::gmtime(&time), "%F %T%z") << '\n' // %m/%d/%y, eg 07/31/17 << std::put_time(std::gmtime(&time), "%D"); } 

La secuencia de los formateadores es importante:

 std::cout < < std::put_time(std::gmtime(&time), "%c %A %Z") << std::endl; // Mon Jul 31 00:00:42 2017 Monday GMT std::cout << std::put_time(std::gmtime(&time), "%Z %c %A") << std::endl; // GMT Mon Jul 31 00:00:42 2017 Monday 

Los formateadores de strftime() son similares:

 char output[100]; if (std::strftime(output, sizeof(output), "%F", std::gmtime(&time))) { std::cout < < output << '\n'; // %Y-%m-%d, eg 2017-07-31 } 

A menudo, el formateador de capital significa "versión completa" y abreviatura de medio en minúscula (por ejemplo, Y: 2017, y: 17).


La configuración regional altera la salida:

 #include  #include  int main() { auto time = std::time(nullptr); std::cout < < "undef: " << std::put_time(std::gmtime(&time), "%c") << '\n'; std::cout.imbue(std::locale("en_US.utf8")); std::cout << "en_US: " << std::put_time(std::gmtime(&time), "%c") << '\n'; std::cout.imbue(std::locale("en_GB.utf8")); std::cout << "en_GB: " << std::put_time(std::gmtime(&time), "%c") << '\n'; std::cout.imbue(std::locale("de_DE.utf8")); std::cout << "de_DE: " << std::put_time(std::gmtime(&time), "%c") << '\n'; std::cout.imbue(std::locale("ja_JP.utf8")); std::cout << "ja_JP: " << std::put_time(std::gmtime(&time), "%c") << '\n'; std::cout.imbue(std::locale("ru_RU.utf8")); std::cout << "ru_RU: " << std::put_time(std::gmtime(&time), "%c"); } 

Salida posible ( Coliru , comstackdor Explorer ):

 undef: Tue Aug 1 08:29:30 2017 en_US: Tue 01 Aug 2017 08:29:30 AM GMT en_GB: Tue 01 Aug 2017 08:29:30 GMT de_DE: Di 01 Aug 2017 08:29:30 GMT ja_JP: 2017年08月01日 08時29分30秒ru_RU: Вт 01 авг 2017 08:29:30 

He usado std::gmtime() para la conversión a UTC. std::localtime() se proporciona para convertir a la hora local.

Preste atención a que asctime() / ctime() que se mencionaron en otras respuestas están marcadas como obsoletas ahora y strftime() debería preferirse.

Siempre está la macro del preprocesador __TIMESTAMP__ .

 #include  using namespace std void printBuildDateTime () { cout < < __TIMESTAMP__ << endl; } int main() { printBuildDateTime(); } 

ejemplo: dom 13 de abril, 11:28:08 2014

podrías usar la clase de tiempo C ++ 11:

  #include  #include  using namespace std; int main() { time_t now = chrono::system_clock::to_time_t(chrono::system_clock::now()); cout < < put_time(localtime(&now), "%F %T") << endl; return 0; } 

fuera puesto:

 2017-08-25 12:30:08 

También puede usar directamente ctime() :

 #include  #include  

Encontré este enlace bastante útil para mi implementación: C ++ Fecha y hora

Aquí está el código que uso en mi implementación, para obtener un formato de salida “YYYYMMDD HHMMSS” claro. El parámetro en es para cambiar entre UTC y la hora local. Puedes modificar fácilmente mi código para adaptarlo a tus necesidades.

 #include  #include  using namespace std; /** * This function gets the current date time * @param useLocalTime true if want to use local time, default to false (UTC) * @return current datetime in the format of "YYYYMMDD HHMMSS" */ string getCurrentDateTime(bool useLocalTime) { stringstream currentDateTime; // current date/time based on current system time_t ttNow = time(0); tm * ptmNow; if (useLocalTime) ptmNow = localtime(&ttNow); else ptmNow = gmtime(&ttNow); currentDateTime < < 1900 + ptmNow->tm_year; //month if (ptmNow->tm_mon < 9) //Fill in the leading 0 if less than 10 currentDateTime << "0" << 1 + ptmNow->tm_mon; else currentDateTime < < (1 + ptmNow->tm_mon); //day if (ptmNow->tm_mday < 10) currentDateTime << "0" << ptmNow->tm_mday < < " "; else currentDateTime << ptmNow->tm_mday < < " "; //hour if (ptmNow->tm_hour < 10) currentDateTime << "0" << ptmNow->tm_hour; else currentDateTime < < ptmNow->tm_hour; //min if (ptmNow->tm_min < 10) currentDateTime << "0" << ptmNow->tm_min; else currentDateTime < < ptmNow->tm_min; //sec if (ptmNow->tm_sec < 10) currentDateTime << "0" << ptmNow->tm_sec; else currentDateTime < < ptmNow->tm_sec; return currentDateTime.str(); } 

Salida (UTC, EST):

 20161123 000454 20161122 190454 

Esto comstackdo para mí en Linux (RHEL) y Windows (x64) apuntando a g ++ y OpenMP:

 #include  #include  #include  #include  //////////////////////////////////////////////////////////////////////////////// // // Reports a time-stamped update to the console; format is: // Name: Update: Year-Month-Day_of_Month Hour:Minute:Second // //////////////////////////////////////////////////////////////////////////////// // // [string] strName : name of the update object // [string] strUpdate: update descripton // //////////////////////////////////////////////////////////////////////////////// void ReportTimeStamp(string strName, string strUpdate) { try { #ifdef _WIN64 // Current time const time_t tStart = time(0); // Current time structure struct tm tmStart; localtime_s(&tmStart, &tStart); // Report cout < < strName << ": " << strUpdate << ": " << (1900 + tmStart.tm_year) << "-" << tmStart.tm_mon << "-" << tmStart.tm_mday << " " << tmStart.tm_hour << ":" << tmStart.tm_min << ":" << tmStart.tm_sec << "\n\n"; #else // Current time const time_t tStart = time(0); // Current time structure struct tm* tmStart; tmStart = localtime(&tStart); // Report cout << strName << ": " << strUpdate << ": " << (1900 + tmStart->tm_year) < < "-" << tmStart->tm_mon < < "-" << tmStart->tm_mday < < " " << tmStart->tm_hour < < ":" << tmStart->tm_min < < ":" << tmStart->tm_sec < < "\n\n"; #endif } catch (exception ex) { cout << "ERROR [ReportTimeStamp] Exception Code: " << ex.what() << "\n"; } return; } 

El ffead-cpp proporciona múltiples clases de utilidad para diversas tareas, una clase de este tipo es la clase de fecha que proporciona muchas funciones desde operaciones de fecha hasta la fecha de aritmética, también hay una clase de temporizador para operaciones de temporización. Puedes echar un vistazo a lo mismo.

http://www.cplusplus.com/reference/ctime/strftime/

Este built-in parece ofrecer un conjunto razonable de opciones.

Esto funciona con G ++. No estoy seguro si esto te ayuda. Salida del progtwig:

 The current time is 11:43:41 am The current date is 6-18-2015 June Wednesday Day of month is 17 and the Month of year is 6, also the day of year is 167 & our Weekday is 3. The current year is 2015. 

Código:

 #include  #include  #include  #include  #include  
 #include  void main() { //Following is a structure to store date / time SYSTEMTIME SystemTime, LocalTime; //To get the local time int loctime = GetLocalTime(&LocalTime); //To get the system time int systime = GetSystemTime(&SystemTime) } 

localtime_s () versión:

 #include  #include  

Puedes usar boost :

 #include  #include  using namespace boost::gregorian; int main() { date d = day_clock::universal_day(); std::cout < < d.day() << " " << d.month() << " " << d.year(); } 

Puede usar el siguiente código para obtener la fecha y hora actual del sistema en C ++:

 #include  #include  

PD: visite este sitio para obtener más información.