2009-03-11 4 views
6

システムクロックが夏時間だとわかっている奇妙な問題が発生していますが、glibcはそうではないようです。これは最新のUbuntuインストールであり、私は/ etc/localtimeをチェックしており、先週のDSTへの切り替えには正しい切り替え時間があります。glibc "timezone"グローバルがDSTのシステム時刻と一致しないのはなぜですか?

私の現在の正しいタイムゾーンは太平洋夏時間(UTC-7)です。私は私がよ何時間帯私のシステムを尋ねると、それは正確に私に語った:

$ date +%z 
-0700 

しかし、私は次のプログラムを実行する場合:

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

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

を出力が誤って、次のとおりです。

28800 

UTC-8または太平洋標準時に相当します。 (そして、私の環境ではTZが設定されていません)

私はglibcと日付プログラムが同じソースから自分のタイムゾーン情報を取得すると思っていましたが、明らかにそうではない、あるいは私が誤解しているglibcタイムゾーングローバルな作品。

基本的な質問は、以下のとおりです。

  1. なぜこれらの2つの出力がどのように私は確実にCプログラムからのオフセットシステムUTCを検出することができます異なる
  2. ですか?

答えて

3

「タイムゾーン」は夏時間に変更されるとは思われません。 "daylight"変数を試してください。これをやった後tm.tm_isdstフィールドで

 
     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

tzsetのマンページを読むと、dayllight変数はローカルゾーンがある時点で夏時間を使用している場合にのみ表示され、現在有効かどうかを必ずしも示すものではありません。 –

+0

私はあなたに同意すると思います。私は{time_t t = time(NULL); printf( "%d \ n"、(int)difftime(mktime(gmtime(&t))、t)); }それは私に "タイムゾーン"と同じ結果を与えます。 –

1

はルック:私のシステムでは

time_t current_time; 
    struct tm tm; 

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

localtime_r(3)のmanページによると、これは実際にはDSTは、指定した時刻に有効であるかどうかを示しありません。私は、DSTが既に使用しているtimezone(3)変数に1時間を追加すると仮定するか、GMTに対してdiffトリックを実行する必要があると思います。

オーストラリアのAESTで私のために働いてください、あなたのために働くことを願っています。

0

はそうLinuxのが定義されている場合tm_gmtoff使用して、このための私のコードで、gettimofdayからtimezone.tz_minuteswestを使用して( 'LTM' ここの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); 
} 
関連する問題