如何在C ++中获取当前时间和日期?

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库提供time()。这是从纪元开始的秒数,可以使用标准的C函数转换为日期和H:M:S。Boost还有一个时间/日期库,您可以查看。

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

旧问题的新答案:

这个问题没有指定在什么时区。有两种合理的可能性:

  • 在UTC中。
  • 在计算机的本地时区。
  • 对于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

    日期库基本上只是为std::chrono::system_clock::time_point添加了一个流操作程序。它还添加了许多其他不错的功能,但在这个简单的程序中没有使用。

    如果您喜欢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

    make_zoned的结果类型是date::zoned_time,它是date::time_zonestd::chrono::system_clock::time_point的对。这对表示本地时间,但也可以表示UTC,这取决于您如何查询它。

    通过以上输出,您可以看到我的计算机当前处于时区,UTC偏移量为-4h,缩写为EDT。

    如果需要其他时区,也可以完成。例如,为了找到悉尼的当前时间,澳大利亚只需将变量local的构造更改为:

    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.

    使用std::time()std::chrono::system_clock::now()或其他时钟类型获取当前时间。

    std::put_time()(C++ 11)和EDCOX1〔3〕(c)提供了许多格式化器输出这些时间。

    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

    strftime()的格式类似:

    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: 20170801082930
    ru_RU: Вт 01 авг 2017 08:29:30

    我用std::gmtime()转换成了UTC。提供std::localtime()转换为当地时间。

    注意,其他答案中提到的asctime()ctime()现在标记为已弃用,应优先使用strftime()


    是的,您可以使用当前嵌入的区域设置指定的格式规则来执行此操作:

    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

    总是有__TIMESTAMP__预处理器宏。

    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


    您也可以直接使用ctime()

    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 ( &current_time );
      localtime_s(&local_time, &current_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;
    }

    您可以使用boost

    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)

    }