2010-10-07 30 views
5

Tôi có một chức năng tối ưu hóa để có được giờ GMT. Tôi muốn chuyển đổi nó thành giờ địa phương. Tôi muốn gọi hàm localtime và gmtime chỉ một lần để điều chỉnh thời gian thành localtime như gọi localtime và gmtime nhiều lần sẽ đánh bại mục đích của việc sử dụng hàm tối ưu. Ý tưởng của tôi là thêm sự khác biệt về múi giờ vào giờ GMT tôi thu được. Tuy nhiên, vấn đề của tôi là làm thế nào tôi có thể điều chỉnh giờ địa phương của mình khi tiết kiệm ánh sáng ban ngày? Bất kỳ ý tưởng về kiểm tra đó?Điều chỉnh thời gian để tiết kiệm ánh sáng ban ngày cho giờ địa phương C++

Cảm ơn.

Trả lời

0

Bạn có thể làm việc trực tiếp với cơ sở dữ liệu múi giờ nhưng có lẽ bạn không thích giới thiệu một thành phần khác.

Nếu tôi theo ý tưởng của bạn, tôi sẽ lưu trữ sự khác biệt về thời gian mỗi tuần hoặc ngày trước và sử dụng chúng sau này. Đây là một chút bẩn vì bạn sẽ mất thời gian chính xác của thiết bị chuyển mạch DST. Để có được độ chính xác tốt nhất, bạn có thể sử dụng tìm kiếm nhị phân trên localtime nhưng điều đó có vẻ quá mức so với việc sử dụng trực tiếp cơ sở dữ liệu múi giờ và những gì bạn đến tại đây có hiệu lực trong cơ sở dữ liệu múi giờ cho múi giờ của bạn.

+0

Lệnh 'zdump -v 'kết xuất dữ liệu múi giờ cho vùng đã chọn ở dạng có thể đọc được của con người. Tôi sẽ phân tích cú pháp đó khi khởi động chương trình thay vì xây dựng lại nó bằng tìm kiếm nhị phân. Hoặc có lẽ tôi sẽ chỉ đọc tệp dữ liệu múi giờ trực tiếp: định dạng của nó được ghi lại trong 'man tzfile'. –

1

Bạn có thể sử dụng cơ sở dữ liệu TZ được lưu trữ phần lớn thời gian trong/usr/share/lib/zoneinfo trong hầu hết các bản phân phối Linux. Cơ sở dữ liệu này quản lý việc tiết kiệm ánh sáng ban ngày để bạn không phải lo lắng về điều đó.

0

Đơn đăng ký của tôi cần có thời gian chuẩn địa phương (theo múi giờ địa phương nhưng không được điều chỉnh cho thời gian tiết kiệm ban ngày). Tôi không chắc chắn nếu điều này là chính xác những gì bạn muốn nhưng tôi tin rằng vấn đề là tương tự. Đây là cách tôi thực hiện điều này bản thân mình. Tôi biết nó có thể di chuyển giữa các cửa sổ và linux:

LgrDate rtn = local(); 
    int8 adjustment = 0;; 
#ifdef _WIN32 
    TIME_ZONE_INFORMATION zone_info; 
    uint4 rcd; 

    rcd = GetTimeZoneInformation(&zone_info); 
    if(rcd == TIME_ZONE_ID_DAYLIGHT) 
    adjustment = zone_info.DaylightBias*nsecPerMin; 
#else 
    // there is no portable means of obtaining the daylight savings time bias directly. We can, 
    // however, obtain the local time, and, if daylight savings time is enabled, we can use mktime 
    // to find out what the bias would be. 
    struct timeval time_of_day; 
    struct tm local_tm; 

    gettimeofday(&time_of_day,0); 
    localtime_r(
    &time_of_day.tv_sec, 
    &local_tm); 
    if(local_tm.tm_isdst > 0) 
    { 
    local_tm.tm_isdst = 0; 
    adjustment = (mktime(&local_tm) - time_of_day.tv_sec) * nsecPerSec * -1; 
    } 
#endif 
    return rtn + adjustment; 
0

Bạn có thể gọi tzset() và sau đó kiểm tra giá trị _daylight.

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