C++: how to get the actual time with time and localtime?

后端 未结 4 740
暖寄归人
暖寄归人 2021-02-19 03:41

I\'m looking for a way to save the time in a HH::MM::SS fashion in C++. I saw here that they are many solutions and after a little research I opted for time and

相关标签:
4条回答
  • 2021-02-19 03:59

    the localtime() call stores the results in an internal buffer.

    Every time you call it you overwrite the buffer.
    An alternative solution would be to make a copy of the buffer.

    time_t      t1  = time(0);           // get time now
    struct tm* now  = localtime( & t1 ); // convert to local time
    struct tm  copy = *now;              // make a local copy.
     //     ^^^ notice no star.
    

    But note: The only time you should be converting to local time is when you display the value. At all other times you should just keep the time as UTC (for storage and manipulation). Since you are only converting the objects for display convert then print immediately and then things will not go wrong.

    0 讨论(0)
  • 2021-02-19 03:59

    You can run continuous clock using following code. It works nicely.

    #include<iostream> 
    #include <Windows.h> 
    #include<ctime> 
    using namespace std;
    
    void main() {
      while(true) {
        system("cls"); //to clear screen
        time_t tim;
        time(&tim); 
        cout << ctime(&tim); 
        Sleep(1);
      }
    }
    
    0 讨论(0)
  • 2021-02-19 04:00

    If you are worried about reentrancy in localtime and gmtime, there is localtime_r and gmtime_r which can handle multiple calls.

    When it comes to formatting the time to your liking, check the function strftime.

    0 讨论(0)
  • 2021-02-19 04:24

    localtime has what is best considered a legacy interface. It can't be used in multithreaded code, for example. In a multithreaded environment, you can use localtime_r under Posix or localtime_s under Windows. Otherwise, all you have to do is save the results:

    tm then = *localtime( &t1 );
    //  ...
    tm now = *localtime( &t2 );
    

    It would probably be more idiomatic, however, to only call localtime
    immediately before formatting the output, e.g.:

    std::string
    timestampToString( time_t timeAndDate )
    {
        char results[100];
        if ( strftime( results, sizeof( results ), "%Y-%m-%d, %H:%M:%S", 
                    localtime( &timeAndDate) ) == 0 ) {
            assert( 0 );
        }
        return results;
    }
    

    and then writing:

    std::cout << formatTime( t1 ) << std::endl;
    

    (You could also create a more generic formatting function, which took the format as an argument.)

    0 讨论(0)
提交回复
热议问题