2009-03-11 33 views
6

Tôi đang gặp phải sự cố kỳ lạ khi đồng hồ hệ thống của tôi biết rằng đó là thời gian tiết kiệm ánh sáng ban ngày, nhưng glibc có vẻ như không. Đây là một bản cài đặt Ubuntu cập nhật, và tôi đã kiểm tra/etc/localtime và nó có thời gian chuyển đổi chính xác cho chuyển đổi của tuần trước thành DST.Tại sao glibc "múi giờ" toàn cầu không đồng ý với thời gian hệ thống trên DST?

Múi giờ chính xác hiện tại của tôi là Giờ ban ngày Thái Bình Dương (UTC-7). Khi tôi hỏi hệ thống của tôi những gì múi giờ tôi đang ở, nó nói với tôi một cách chính xác:

$ date +%z 
-0700 

Nhưng khi tôi chạy chương trình sau:

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

int main() { 
    tzset(); 
    printf("%lu\n", timezone); 
    return 0; 
} 

Kết quả là, không đúng cách:

28800 

Tương ứng với UTC-8 hoặc Giờ chuẩn Thái Bình Dương. (Và không, TZ không được đặt trong môi trường của tôi)

Tôi nghĩ glibc và chương trình ngày sẽ nhận được thông tin múi giờ của họ từ cùng một nguồn, nhưng dường như họ không hoặc tôi hiểu sai múi giờ glibc công trình toàn cầu.

Các câu hỏi cơ bản là sau đó:

  1. Tại sao hai đầu ra những khác nhau
  2. Làm thế nào tôi có thể chắc chắn phát hiện UTC hệ thống bù đắp từ một chương trình C?

Trả lời

3

Tôi không nghĩ rằng "múi giờ" thay đổi theo thời gian ban ngày. Hãy thử biến "ánh sáng ban ngày". Trên hệ thống của tôi:

 
     The external variable timezone contains the difference, in seconds, 
     between UTC and local standard time (for example, in the U.S. Eastern 
     time zone (EST), timezone is 5*60*60). The external variable daylight 
     is non-zero only if a summer time zone adjustment is specified in the 
     TZ environment variable. 
+0

Việc đọc manpage của tôi cho tzset chỉ ra rằng biến dayllight chỉ biểu thị nếu vùng cục bộ sử dụng tiết kiệm ánh sáng ban ngày tại một thời điểm nào đó và không nhất thiết cho biết liệu nó có hiệu lực hay không. –

+0

Tôi nghĩ rằng tôi đồng ý với bạn. Tôi muốn đề xuất {time_t t = time (NULL); printf ("% d \ n", (int) difftime (mktime (gmtime (& t)), t)); } nhưng điều đó mang lại cho tôi kết quả tương tự như "múi giờ". –

1

Nhìn vào lĩnh vực tm.tm_isdst sau khi làm điều này:

time_t current_time; 
    struct tm tm; 

    current_time = time(NULL); 
    localtime_r(&current_time, &tm); 

Theo localtime_r (3) manpage, điều này không thực sự cho biết DST là có hiệu lực vào thời gian quy định . Tôi nghĩ rằng bạn sau đó cần phải giả định rằng DST thêm một giờ vào múi giờ (3) biến bạn đang sử dụng, hoặc làm các trick khác chống lại GMT.

Làm việc cho tôi ở Úc AEST, hy vọng nó hoạt động cho bạn.

0

Đây là mã của tôi cho điều này bằng tm_gmtoff nếu linux được xác định, và sử dụng timezone.tz_minuteswest từ gettimofday khác (ở đây 'ltm' là sản phẩm của localtime):

{ 
    int tz_offset; 

#if defined(__linux__) 
    tz_offset= ltm.tm_gmtoff; 
#else 
    tz_offset= -tz.tz_minuteswest*60 + ltm.tm_isdst*3600; 
#endif 

    printf ("LT = UTC +d sec\n", tz_offset); 
} 
Các vấn đề liên quan