How to get current time and date in C++?
在C++中是否有跨平台的方式获取当前日期和时间?
在C++ 11中,可以使用EDCOX1×4
示例(从en.cppreference.com复制):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #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 "; } |
这应该打印如下内容:
1 2 | finished computation at Mon Oct 2 00:59:08 2017 elapsed time: 1.88232s |
C++与C共享它的日期/时间函数。TM结构可能是C++程序员最容易使用的。
1 2 3 4 5 6 7 8 9 10 11 12 | #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 <<" "; } |
您可以尝试以下跨平台代码以获取当前日期/时间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #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 } |
输出:
1 | currentDateTime()=2012-05-06.21:47:59 |
有关日期/时间格式的详细信息,请访问此处
std c库提供
1 2 | time_t timev; time(&timev); |
C++标准库不提供合适的日期类型。C++继承了来自C的日期和时间操作的结构和函数,以及考虑本地化的一对日期/时间输入和输出函数。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | // 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; } |
旧问题的新答案:
这个问题没有指定在什么时区。有两种合理的可能性:
对于1,可以使用此日期库和以下程序:
1 2 3 4 5 6 7 8 9 10 11 | #include"date.h" #include <iostream> int main() { using namespace date; using namespace std::chrono; std::cout << system_clock::now() << ' '; } |
它只是为我输出:
1 | 2015-08-18 22:08:18.944211 |
日期库基本上只是为
如果您喜欢2(本地时间),那么在日期库的基础上有一个时区库。这两个库都是开源的和跨平台的,假设编译器支持C++ 11或C++ 14。
1 2 3 4 5 6 7 8 9 10 11 12 | #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 << ' '; } |
这对我来说只是输出:
1 | 2015-08-18 18:08:18.944211 EDT |
通过以上输出,您可以看到我的计算机当前处于时区,UTC偏移量为-4h,缩写为EDT。
如果需要其他时区,也可以完成。例如,为了找到悉尼的当前时间,澳大利亚只需将变量
1 | auto local = make_zoned("Australia/Sydney", system_clock::now()); |
输出变为:
1 | 2015-08-19 08:08:18.944211 AEST |
(对于谷歌同事)
还有boost::日期时间:
1 2 3 | #include <boost/date_time/posix_time/posix_time.hpp> boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time(); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <stdio.h> #include <time.h> int main () { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); timeinfo = localtime ( &rawtime ); printf ("Current local time and date: %s", asctime (timeinfo) ); return 0; } |
1 2 | auto time = std::time(nullptr); std::cout << std::put_time(std::localtime(&time),"%F %T%z"); // ISO 8601 format. |
使用
1 2 3 4 5 6 7 8 9 10 11 12 | #include <iomanip> #include <iostream> int main() { auto time = std::time(nullptr); std::cout // ISO 8601: %Y-%m-%d %H:%M:%S, e.g. 2017-07-31 00:42:00+0200. << std::put_time(std::gmtime(&time),"%F %T%z") << ' ' // %m/%d/%y, e.g. 07/31/17 << std::put_time(std::gmtime(&time),"%D"); } |
格式化程序的顺序很重要:
1 2 3 4 | 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 |
1 2 3 4 5 | char output[100]; if (std::strftime(output, sizeof(output),"%F", std::gmtime(&time))) { std::cout << output << ' '; // %Y-%m-%d, e.g. 2017-07-31 } |
通常,大写格式设置工具表示"完整版本",小写字母表示缩写(例如Y:2017,Y:17)。
区域设置更改输出:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <iomanip> #include <iostream> int main() { auto time = std::time(nullptr); std::cout <<"undef:" << std::put_time(std::gmtime(&time),"%c") << ' '; std::cout.imbue(std::locale("en_US.utf8")); std::cout <<"en_US:" << std::put_time(std::gmtime(&time),"%c") << ' '; std::cout.imbue(std::locale("en_GB.utf8")); std::cout <<"en_GB:" << std::put_time(std::gmtime(&time),"%c") << ' '; std::cout.imbue(std::locale("de_DE.utf8")); std::cout <<"de_DE:" << std::put_time(std::gmtime(&time),"%c") << ' '; std::cout.imbue(std::locale("ja_JP.utf8")); std::cout <<"ja_JP:" << std::put_time(std::gmtime(&time),"%c") << ' '; std::cout.imbue(std::locale("ru_RU.utf8")); std::cout <<"ru_RU:" << std::put_time(std::gmtime(&time),"%c"); } |
可能的输出(coliru、编译器资源管理器):
1 2 3 4 5 6 | 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 |
我用
注意,其他答案中提到的
是的,您可以使用当前嵌入的区域设置指定的格式规则来执行此操作:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 | #include <iostream> #include <iterator> #include <string> 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<char> out(os); std::use_facet<std::time_put<char>>(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"); } |
Output:
Fri Sep 6 20:33:31 2013
你可以使用C++ 11时间类:
1 2 3 4 5 6 7 8 9 10 | #include <iostream> #include <iomanip> 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; } |
输出:
1 | 2017-08-25 12:30:08 |
总是有
1 2 3 4 5 6 7 8 9 10 11 | #include <iostream> using namespace std void printBuildDateTime () { cout << __TIMESTAMP__ << endl; } int main() { printBuildDateTime(); } |
示例:2014年4月13日,11:28:08
我发现这个链接对于我的实现非常有用:C++日期和时间
这是我在实现中使用的代码,用于获得一个清晰的"yymmdd hhmmss"输出格式。中的参数用于在UTC和本地时间之间切换。您可以轻松地修改我的代码以满足您的需要。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 | #include <iostream> #include <ctime> 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(); } |
输出(UTC、EST):
1 2 | 20161123 000454 20161122 190454 |
您也可以直接使用
1 2 3 4 5 6 7 8 9 10 11 12 13 | #include <stdio.h> #include <time.h> int main () { time_t rawtime; struct tm * timeinfo; time ( &rawtime ); printf ("Current local time and date: %s", ctime (&rawtime) ); return 0; } |
这是为我在Linux(rhel)和Windows(x64)上针对g++和OpenMP编译的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 | #include <ctime> #include <iostream> #include <string> #include <locale> //////////////////////////////////////////////////////////////////////////////// // // 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 <<" "; #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 <<" "; #endif } catch (exception ex) { cout <<"ERROR [ReportTimeStamp] Exception Code: " << ex.what() <<" "; } return; } |
ffead cpp为各种任务提供了多个实用程序类,其中一个类是日期类,它提供了从日期操作到日期算术的许多功能,还为定时操作提供了一个计时器类。你也可以看看。
网址:http://www.cplusplus.com/reference/ctime/strftime/
这个内置的似乎提供了一组合理的选项。
这与G++一起工作,我不确定这是否对您有帮助。程序输出:
1 2 3 4 5 | 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. |
代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | #include <ctime> #include <iostream> #include <string> #include <stdio.h> #include <time.h> using namespace std; const std::string currentTime() { time_t now = time(0); struct tm tstruct; char buf[80]; tstruct = *localtime(&now); strftime(buf, sizeof(buf),"%H:%M:%S %P", &tstruct); return buf; } const std::string currentDate() { time_t now = time(0); struct tm tstruct; char buf[80]; tstruct = *localtime(&now); strftime(buf, sizeof(buf),"%B %A", &tstruct); return buf; } int main() { cout <<"\033[2J\033[1;1H"; std:cout <<"The current time is" << currentTime() << std::endl; time_t t = time(0); // get time now struct tm * now = localtime( & t ); cout <<"The current date is" << now->tm_mon + 1 << '-' << (now->tm_mday + 1) << '-' << (now->tm_year + 1900) <<"" << currentDate() << endl; cout <<"Day of month is" << (now->tm_mday) <<" and the Month of year is" << (now->tm_mon)+1 <<"," << endl; cout <<"also the day of year is" << (now->tm_yday) <<" & our Weekday is" << (now->tm_wday) <<"." << endl; cout <<"The current year is" << (now->tm_year)+1900 <<"." << endl; return 0; } |
localtime_s()版本:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | #include <stdio.h> #include <time.h> int main () { time_t current_time; struct tm local_time; time ( ¤t_time ); localtime_s(&local_time, ¤t_time); int Year = local_time.tm_year + 1900; int Month = local_time.tm_mon + 1; int Day = local_time.tm_mday; int Hour = local_time.tm_hour; int Min = local_time.tm_min; int Sec = local_time.tm_sec; return 0; } |
您可以使用以下代码在C++中获取当前系统日期和时间:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | #include <iostream> #include <time.h> //It may be #include <ctime> or any other header file depending upon // compiler or IDE you're using using namespace std; int main() { // current date/time based on current system time_t now = time(0); // convert now to string form string dt = ctime(&now); cout <<"The local date and time is:" << dt << endl; return 0; } |
附:欲了解更多信息,请访问本网站。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | #include <iostream> #include <chrono> #include <string> #pragma warning(disable: 4996) // Ver: C++ 17 // IDE: Visual Studio int main() { using namespace std; using namespace chrono; time_point tp = system_clock::now(); time_t tt = system_clock::to_time_t(tp); cout <<"Current time:" << ctime(&tt) << endl; return 0; } |
您可以使用
1 2 3 4 5 6 7 8 9 | #include <boost/date_time/gregorian/gregorian.hpp> #include <iostream> using namespace boost::gregorian; int main() { date d = day_clock::universal_day(); std::cout << d.day() <<"" << d.month() <<"" << d.year(); } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | #include <Windows.h> 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) } |