2012-06-28 43 views
6

Tôi muốn trích xuất giờ, phút và giây làm giá trị số nguyên từ giá trị time_t đại diện cho giây kể từ thời đại.Làm thế nào để trích xuất giờ từ time_t?

Giá trị giờ không chính xác. Tại sao?

#include <stdio.h> 
#include <time.h> 

#include <unistd.h> 

int main() 
{ 
    char buf[64]; 

    while (1) { 
     time_t t = time(NULL); 
     struct tm *tmp = gmtime(&t); 

     int h = (t/360) % 24; /* ### My problem. */ 
     int m = (t/60) % 60; 
     int s = t % 60; 

     printf("%02d:%02d:%02d\n", h, m, s); 

     /* For reference, extracts the correct values. */ 
     strftime(buf, sizeof(buf), "%H:%M:%S\n", tmp); 
     puts(buf); 
     sleep(1); 
    } 
} 

Output (giờ nên 10)

06:15:35 
10:15:35 

06:15:36 
10:15:36 

06:15:37 
10:15:37 
+0

"int h = (t/3600)% 24; ..." làm cho _assumption_ 'time_t' bằng số nguyên giây. Mặc dù đó là phổ biến, nó không được xác định là như vậy bởi C. Sử dụng 'gmtime()/localtime()' hoặc 'difftime()' cho mã di động. – chux

Trả lời

5

Cuộc gọi của bạn để gmtime() đã thực hiện điều đó, kết quả struct tm có tất cả các lĩnh vực. Xem the documentation.

Nói cách khác, chỉ cần

printf("hours is %d\n", tmp->tm_hour); 

tôi cho rằng đây là cách đúng đắn, vì nó tránh được sự tham gia của số scarily lớn để làm việc chuyển đổi bằng tay trong mã của bạn. Nó làm như vậy theo cách tốt nhất, bằng cách biến nó thành Vấn đề của Người khác (tức là, trừu tượng hóa nó đi). Vì vậy, hãy sửa mã của bạn bằng cách thêm số thiếu 0, nhưng bằng cách sử dụng gmtime().

Cũng nghĩ về múi giờ.

+0

Cảm ơn, nhưng câu hỏi là: Tại sao tính toán không chính xác. (Tôi đồng ý rằng bằng cách sử dụng struct tm là một cách tiếp cận tốt hơn mặc dù). –

+2

@dannas: Cuz bạn đang chia làm: t/360, nơi nó phải là t/3600 (nhớ 60 * 60) – Abhineet

+0

Hm, câu hỏi thực sự là: "cách trích xuất giờ từ time_t" (trong thông số vấn đề tôi đã thêm câu hỏi). Chấp nhận câu trả lời vì nó cho một lý do chính đáng là tại sao tôi nên tránh tự mình thực hiện chuyển đổi. –

11
int h = (t/3600) % 24; /* ### Your problem. */ 
+0

Doh, tại sao tôi không thấy điều đó rõ ràng? –

+0

Tôi nghĩ rằng tất cả mọi người đôi khi nhìn vào một lỗi và không nhìn thấy nó. Nó thường với tôi;) –

Các vấn đề liên quan