6

システム時計が夏時間であることを認識しているという奇妙な問題が発生していますが、glibcはそうではないようです。これは最新のUbuntuインストールであり、/ etc / localtimeを確認しましたが、先週の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つの出力が異なるのはなぜですか
  2. CプログラムからシステムUTCオフセットを確実に検出するにはどうすればよいですか?
4

4 に答える 4

3

「タイムゾーン」は夏時間で変わるとは思いません。「昼光」変数を試してください。私のシステムでは:

      外部変数 timezone には、差が秒単位で含まれています。
      UTC と現地標準時の間 (たとえば、米国東部時間)
      タイム ゾーン (EST)、タイム ゾーンは 5*60*60)。外部変数昼光
      夏時間帯の調整が
      TZ 環境変数。
于 2009-03-11T18:47:13.277 に答える
1

これを行った後、tm.tm_isdstフィールドを見てください。

  time_t current_time;
  struct tm tm;

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

localtime_r(3)のマンページによると、これは実際には、指定された時間にDSTが有効であるかどうかを示します。次に、DSTがすでに使用しているtimezone(3)変数に1時間を追加することを想定するか、GMTに対して差分トリックを実行する必要があると思います。

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

于 2011-01-07T23:52:30.203 に答える
0

Here is my code for this using tm_gmtoff if linux is defined, and using timezone.tz_minuteswest from gettimofday otherwise (here 'ltm' is the output of 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);
}
于 2015-04-29T05:44:56.633 に答える
0

tm_gmtoff::timezone と同じ struct tm のメンバーを使用できますが、DST を考慮し、符号が逆になります。

http://www.gnu.org/s/libc/manual/html_node/Time-Zone-Functions.html#Time-Zone-Functions

于 2011-03-18T06:09:49.510 に答える