C ++: как получить фактическое время со временем и местное время? - PullRequest
13 голосов
/ 07 ноября 2011

Я ищу способ сэкономить время в формате HH :: MM :: SS на C ++. Я увидел здесь, что у них много решений, и после небольшого исследования я выбрал time и localtime. Тем не менее, кажется, что функция localtime немного сложна, так как говорит :

Все вызовы localtime и gmtime используют одну и ту же статическую структуру, поэтому каждый вызов перезаписывает результаты предыдущего вызова.

Проблема, которую это вызывает, показана в следующем фрагменте кода:

#include <ctime>
#include <iostream>
using namespace std;

int main() {
time_t t1 = time(0);   // get time now
struct tm * now = localtime( & t1 );

std::cout << t1 << std::endl;
sleep(2);
time_t t2 = time(0);   // get time now
struct tm * now2 = localtime( & t2 );
std::cout << t2 << std::endl;

cout << (now->tm_year + 1900) << '-'
     << (now->tm_mon + 1) << '-'
     <<  now->tm_mday << ", "
     << now->tm_hour << ":" << now->tm_min << ":" << now->tm_sec
     << endl;

cout << (now2->tm_year + 1900) << '-'
     << (now2->tm_mon + 1) << '-'
     <<  now2->tm_mday << ", "
     << now2->tm_hour << ":" << now2->tm_min << ":" << now2->tm_sec
     << endl;
}

Типичный вывод для этого:

1320655946
1320655948
2011-11-7, 9:52:28
2011-11-7, 9:52:28

Итак, как вы можете видеть, отметки времени time_t верны, но местное время все портит.

Мой вопрос: как мне преобразовать отметку времени типа time_t в удобочитаемое время?

Ответы [ 4 ]

19 голосов
/ 07 ноября 2011

Если вы беспокоитесь о повторном входе в localtime и gmtime, есть localtime_r и gmtime_r, которые могут обрабатывать несколько вызовов.

Когда дело доходит до форматирования времени по вашему вкусу,проверьте функцию strftime.

3 голосов
/ 07 ноября 2011

вызов localtime () сохраняет результаты во внутреннем буфере.

Каждый раз, когда вы вызываете его, вы перезаписываете буфер.
Альтернативным решением будет создание копии буфера.

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.

Но обратите внимание: единственное время, когда вы должны конвертировать в местное время, это когда вы отображаете значение.В остальное время вы должны просто хранить время как UTC (для хранения и манипуляции).Так как вы только конвертируете объекты для отображения, преобразуйте их немедленно, и тогда все пойдет не так.

0 голосов
/ 03 июля 2014

Вы можете запустить непрерывные часы, используя следующий код. Работает хорошо.

#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 голосов
/ 07 ноября 2011

localtime имеет то, что лучше всего считать устаревшим интерфейсом.Например, его нельзя использовать в многопоточном коде.В многопоточной среде вы можете использовать localtime_r в Posix или localtime_s в Windows.В противном случае все, что вам нужно сделать, это сохранить результаты:

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

Однако, возможно, было бы более идиоматичным вызывать localtime
непосредственно перед форматированием вывода, например:

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

и затем запись:

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

(Вы также можете создать более общую функцию форматирования, которая будет принимать формат в качестве аргумента.)

...