2011-11-07 11 views
12

Tôi đang tìm cách tiết kiệm thời gian trong HH :: MM :: SS fashion in C++. Tôi thấy ở đây rằng họ có nhiều giải pháp và sau một ít nghiên cứu tôi đã chọn cho timelocaltime. Tuy nhiên, nó có vẻ như các localtime chức năng là một chút khó khăn, vì nó says:C++: làm thế nào để có được thời gian thực tế với thời gian và giờ địa phương?

Tất cả các cuộc gọi đến và localtime gmtime sử dụng cấu trúc tĩnh cùng, vì vậy mỗi cuộc gọi ghi đè các kết quả của các cuộc gọi trước đó.

Vấn đề mà điều này gây ra được trình bày trong đoạn mã tiếp theo:

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

Một sản lượng điển hình cho điều này là:

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

Như bạn có thể thấy, time_t timestamps là đúng, nhưng giờ địa phương làm mọi thứ lộn xộn.

Câu hỏi của tôi là: làm cách nào để chuyển đổi một loại dấu thời gian ot time_t thành thời gian có thể đọc được?

Trả lời

18

Nếu bạn lo lắng về sự reentrancy trong localtimegmtime, có localtime_rgmtime_r có thể xử lý nhiều cuộc gọi.

Khi nói đến định dạng thời gian theo ý thích của bạn, hãy kiểm tra chức năng strftime.

+1

+1. Tôi thậm chí không biết về * _r! Cảm ơn! – Viet

3

cuộc gọi localtime() lưu trữ kết quả trong bộ đệm trong.

Mỗi khi bạn gọi nó, bạn sẽ ghi đè bộ đệm.
Một giải pháp thay thế sẽ là tạo một bản sao của bộ đệm.

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. 

Nhưng lưu ý: Thời gian duy nhất bạn nên chuyển đổi thành giờ địa phương là khi bạn hiển thị giá trị. Tại tất cả các lần khác, bạn chỉ nên giữ thời gian như UTC (để lưu trữ và thao tác). Vì bạn chỉ chuyển đổi các đối tượng để chuyển đổi hiển thị, sau đó in ngay lập tức và sau đó mọi thứ sẽ không đi sai.

+0

+1 Để làm rõ rằng tôi chỉ cần thực hiện chuyển đổi ở cuối. Cảm ơn! – seb

0

localtime có cái được coi là giao diện cũ nhất. Ví dụ: không thể là được sử dụng trong mã đa luồng. Trong môi trường đa luồng, bạn có thể sử dụng localtime_r trong Posix hoặc localtime_s trong Windows. Nếu không, tất cả các bạn phải làm là lưu các kết quả:

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

Nó có lẽ sẽ nhiều thành ngữ, tuy nhiên, để chỉ gọi localtime
ngay lập tức trước khi định dạng đầu ra, ví dụ:

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

và sau đó viết:

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

(Bạn cũng có thể tạo hàm định dạng chung hơn, lấy định dạng làm đối số.)

-1

Bạn có thể chạy đồng hồ liên tục bằng mã sau. Nó hoạt động độc đáo.

#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

Tôi nghĩ rằng điều này không trả lời được câu hỏi. (cách hiển thị time_t theo định dạng có thể đọc được của con người) – andrel

+0

Vui lòng đọc câu hỏi trước khi bạn trả lời –