How to get current time and date in C++?

后端 未结 24 1924
刺人心
刺人心 2020-11-22 06:55

Is there a cross-platform way to get the current date and time in C++?

24条回答
  •  挽巷
    挽巷 (楼主)
    2020-11-22 07:31

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

    Get the current time either using std::time() or std::chrono::system_clock::now() (or another clock type).

    std::put_time() (C++11) and strftime() (C) offer a lot of formatters to output those times.

    #include 
    #include 
    
    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") << '\n'
            // %m/%d/%y, e.g. 07/31/17
            << std::put_time(std::gmtime(&time), "%D"); 
    }
    

    The sequence of the formatters matters:

    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
    

    The formatters of strftime() are similar:

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

    Often, the capital formatter means "full version" and lowercase means abbreviation (e.g. Y: 2017, y: 17).


    Locale settings alter the output:

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

    Possible output (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
    

    I've used std::gmtime() for conversion to UTC. std::localtime() is provided to convert to local time.

    Heed that asctime()/ctime() which were mentioned in other answers are marked as deprecated now and strftime() should be preferred.

提交回复
热议问题