如何在C ++中获取当前的时间和date?
是否有跨平台的方式来获取当前的C + +的date和时间?
标准C库提供了time()
。 这是从时代开始的秒,可以使用标准C函数转换为date和H:M:S
。 升压还有一个时间/date库 ,你可以检查。
time_t timev; time(&timev);
C ++与C分享它的date/时间函数。tm结构对于C ++程序员来说可能是最简单的 – 下面列出今天的date:
#include <ctime> #include <iostream> using namespace std; int main() { time_t t = time(0); // get time now struct tm * now = localtime( & t ); cout << (now->tm_year + 1900) << '-' << (now->tm_mon + 1) << '-' << now->tm_mday << endl; }
在C ++ 11中,你可以使用std :: chrono :: system_clock :: now()
(点击链接查看示例/用法。)
您可以尝试以下跨平台代码来获取当前date/时间:
#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 }
输出:
currentDateTime()=2012-05-06.21:47:59
请访问这里获取更多关于date/时间格式的信息
C ++标准库不提供适当的datetypes。 C ++inheritance了C的date和时间操作的结构和函数,还有一些考虑到本地化的date/时间input和输出函数。
// 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; }
(对于谷歌同行)
还有Boost :: date_time :
#include <boost/date_time/posix_time/posix_time.hpp> boost::posix_time::ptime date_time = boost::posix_time::microsec_clock::universal_time();
一个老问题的新答案:
这个问题没有说明在什么时区。 有两个合理的可能性:
- 在UTC。
- 在电脑的当地时区。
对于1,你可以使用这个date库和下面的程序:
#include "date.h" #include <iostream> int main() { using namespace date; using namespace std::chrono; std::cout << system_clock::now() << '\n'; }
哪些只是输出给我:
2015-08-18 22:08:18.944211
date库本质上只是为std::chrono::system_clock::time_point
添加一个stream操作符。 它还增加了很多其他很好的function,但是这不是用在这个简单的程序中。
如果您更喜欢2(当地时间),则在date库顶部build立一个时区 库 。 这两个库都是开源的和跨平台的 ,假设编译器支持C ++ 11或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'; }
我只是输出:
2015-08-18 18:08:18.944211 EDT
make_zoned
的结果types是一个date::zoned_time
,它是一个date::time_zone
和一个std::chrono::system_clock::time_point
。 这对代表当地时间,但也可以代表UTC,具体取决于您如何查询。
通过上面的输出,您可以看到我的电脑当前处于UTC偏移为-4h的时区,缩写为EDT。
如果需要其他时区,也可以完成。 例如,要find澳大利亚悉尼的当前时间,只需将variableslocal
的构build更改为:
auto local = make_zoned("Australia/Sydney", system_clock::now());
输出更改为:
2015-08-19 08:08:18.944211 AEST
#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; }
是的,您可以使用由当前填充的语言环境指定的格式规则来执行此操作:
#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"); }
产出:
Fri Sep 6 20:33:31 2013
总是有__TIMESTAMP__
预处理macros。
#include <iostream> using namespace std void printBuildDateTime () { cout << __TIMESTAMP__ << endl; } int main() { printBuildDateTime(); }
例如:2014年4月13日星期日11:28:08
你也可以直接使用ctime()
:
#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; }
我发现这个链接对我的实现非常有用: C ++ Date and Time
以下是我在实现中使用的代码,以获得清晰的“YYYYMMDD HHMMSS”输出格式。 参数是在UTC和本地时间之间切换的。 您可以轻松修改我的代码以满足您的需求。
#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):
20161123 000454 20161122 190454
这为在Linux(RHEL)和Windows(x64)上针对g ++和OpenMP编译:
#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 << "\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; }
http://www.cplusplus.com/reference/ctime/strftime/
这个内置似乎提供了一个合理的select。
这与G ++的工作,我不知道这是否有助于你。 节目输出:
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.
代码:
#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; }
auto time = std::time(nullptr); std::cout << std::put_time(std::localtime(&time), "%F %T%z"); // ISO 8601 format.
获取当前时间使用std::time()
或std::chrono::system_clock::now()
(或另一种时钟types )。
std::put_time()
(C ++ 11)和strftime()
(C)提供了很多格式化程序来输出这些时间。
#include <iomanip> #include <iostream> 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"); }
格式化程序的顺序很重要:
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
strftime()
的格式化器是相似的:
char output[100]; if (std::strftime(output, sizeof(output), "%F", std::gmtime(&time))) { std::cout << output << '\n'; // %Y-%m-%d, eg 2017-07-31 }
资本格式化程序通常意味着“完整版本”,小写字母表示缩写(例如Y:2017,Y:17)。
区域设置改变输出:
#include <iomanip> #include <iostream> 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"); }
可能的输出( Coliru , 编译器资源pipe理器 ):
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
我用std::gmtime()
转换为UTC。 std::localtime()
来转换为本地时间。
注意在其他答案中提到的asctime()
/ ctime()
现在被标记为已弃用, strftime()
应该是首选。
ffead-cpp为各种任务提供了多个实用工具类,其中一个类是Date类,它提供了很多从Date操作到date算术的function,还有一个为定时操作提供的Timer类。 你可以看一看。
你可以使用C ++ 11时间类:
#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; }
输出:
2017-08-25 12:30:08
#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) }
你可以使用boost
:
#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(); }
localtime_s()版本:
#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; }