Como obter hora e data atuais em C ++?

Existe uma maneira de plataforma cruzada para obter a data e hora atuais em C ++?

Em C ++ 11 você pode usar std::chrono::system_clock::now()

C ++ compartilha suas funções de data / hora com C. A estrutura tm é provavelmente a mais fácil para um programador C ++ trabalhar – as seguintes impressões imprimem a data de hoje:

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

Você pode tentar o seguinte código de plataforma cruzada para obter a data / hora atual:

 #include  #include  #include  #include  

Saída:

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

Por favor, visite aqui para mais informações sobre o formato de data / hora

As bibliotecas std C fornecem time() . Isso é segundos da época e pode ser convertido para data e H:M:S usando funções padrão de C. O Boost também tem uma biblioteca de horário / data que você pode verificar.

 time_t timev; time(&timev); 

a biblioteca padrão C ++ não fornece um tipo de data apropriado. O C ++ herda as estruturas e funções para manipulação de data e hora do C, juntamente com algumas funções de input e saída de data / hora que levam em conta a localização.

 // 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; } 

Nova resposta para uma pergunta antiga:

A questão não especifica em que fuso horário. Existem duas possibilidades razoáveis:

  1. Em UTC.
  2. No fuso horário local do computador.

Para 1, você pode usar esta biblioteca de datas e o seguinte programa:

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

Qual saída apenas para mim:

 2015-08-18 22:08:18.944211 

A biblioteca de datas apenas adiciona um operador de streaming para std::chrono::system_clock::time_point . Ele também adiciona muitas outras funcionalidades legais, mas isso não é usado neste programa simples.

Se você preferir 2 (a hora local), há uma biblioteca de fuso horário que é construída sobre a biblioteca de datas . Ambas as bibliotecas são open source e cross-platform , assumindo que o compilador suporta C ++ 11 ou 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'; } 

Qual para mim apenas output:

 2015-08-18 18:08:18.944211 EDT 

O tipo de resultado de make_zoned é um date::zoned_time que é um par de uma date::time_zone e um std::chrono::system_clock::time_point . Este par representa um horário local, mas também pode representar o UTC, dependendo de como você o consulta.

Com a saída acima, você pode ver que meu computador está atualmente em um fuso horário com um deslocamento UTC de -4h e uma abreviação de EDT.

Se algum outro fuso horário for desejado, isso também pode ser feito. Por exemplo, para encontrar a hora atual em Sydney, Austrália, basta alterar a construção da variável local para:

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

E a saída muda para:

 2015-08-19 08:08:18.944211 AEST 

(Para colegas googlers)

Há também Boost :: date_time :

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

Sim e você pode fazer isso com as regras de formatação especificadas pela localidade atualmente imbuída:

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

Resultado: 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. 

Obtenha a hora atual usando std::time() ou std::chrono::system_clock::now() (ou outro tipo de relógio ).

std::put_time() (C ++ 11) e strftime() (C) oferecem muitos formatadores para produzir esses tempos.

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

A sequência dos formatadores é 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 

Os formatadores de strftime() são semelhantes:

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

Muitas vezes, o formatador de capital significa "versão completa" e significa minúscula abreviação (por exemplo, Y: 2017, y: 17).


Configurações de localidade alteram a saída:

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

Saída possível ( Coliru , Compiler 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 

Eu usei std::gmtime() para conversão para UTC. std::localtime() é fornecido para converter em hora local.

asctime() que asctime() / ctime() que foram mencionadas em outras respostas estão marcadas como obsoletas agora e strftime() deve ser preferido.

Há sempre a macro de pré-processador __TIMESTAMP__ .

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

exemplo: domingo 13 de abril 11:28:08 2014

você poderia usar a class de tempo do 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; } 

fora colocado:

 2017-08-25 12:30:08 

Você também pode usar diretamente ctime() :

 #include  #include  

Eu encontrei este link bastante útil para minha implementação: C ++ Date and Time

Aqui está o código que eu uso na minha implementação, para obter um formato de saída “YYYYMMDD HHMMSS”. O parâmetro in é para alternar entre o UTC e a hora local. Você pode modificar facilmente meu código para atender à sua necessidade.

 #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(); } 

Saída (UTC, EST):

 20161123 000454 20161122 190454 

Isso foi compilado para mim no Linux (RHEL) e no Windows (x64) visando g ++ e 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; } 

O ffead-cpp fornece várias classs de utilitários para várias tarefas, uma class é a class Date que fornece muitos resources desde operações de Data até a aritmética de data, há também uma class Timer fornecida para operações de cronometragem. Você pode dar uma olhada no mesmo.

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

Este built-in parece oferecer um conjunto razoável de opções.

Isso funciona com o G ++, não tenho certeza se isso ajuda você. Saída do programa:

 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) } 

versão localtime_s ():

 #include  #include  

Você poderia usar boost :

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

Você pode usar o seguinte código para obter a data e hora atuais do sistema em C ++:

 #include  #include  

PS: Visite este site para mais informações.