tzdataデータベース (IANA またはオペレーティング システム ベンダーによって発行されたもの)を解析して、過去のタイムゾーン情報を取得するにはどうすればよいですか?
たとえば、実際にあっAsia/Tokyo
た特定の時点でのGMT への時間オフセットを知りたい1435100000
2015-04-25T22:13:20+00:00 (UTC)
通常、この種の質問に答えるために自分でデータ ファイルを解析する必要はありません。
Unix と Linux のほとんどのバージョンでは、このプログラムは、探しているタイム オフセットを提供します。
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int main()
{
time_t t = 1435100000;
struct tm *tmp;
setenv("TZ", "Asia/Tokyo", 1);
tzset();
tmp = localtime(&t);
printf("offset = %ld\n", tmp->tm_gmtoff);
}
残念ながら、tm_gmtoff
このプログラムが依存している分野は非常に有用ですが、非標準です。(Unix の一部のバージョンでは、名前が付けられている場合があります_tm_gmtoff
。一部のバージョンでは、まったく存在しない場合があります。) 利用できない場合tm_gmtoff
、またはコードをできるだけ移植可能にする必要がある場合は、代わりにこのトリックを使用できます。
time_t t2;
tmp = gmtime(&t);
t2 = mktime(tmp);
printf("offset = %ld\n", t - t2);
Unix、Linux、MacOS、および IANA コードとデータを使用するすべてのプラットフォームの場合、これらのようなプログラムは、1970 年 1 月 1 日以降の任意のタイム ゾーンおよび任意の時点で正しい結果を返すはずです。
1970 年 1 月 1 日より前の時間については、通常の IANA データは包括的ではないため、古い日付と時間で作業する必要がある場合は、別のことを行う必要がある場合があります。(IANA データには 1970 年以前のタイム ゾーン規則がある程度含まれていますが、それほど包括的ではなく、決定的であるとは主張していません。)
私が理解しているように、Windows での日付と時刻のコードは過去のタイム ゾーン情報を保持せず、常に現在の年のルールを使用して過去の日付を使用するため、Windows では独自のコードを記述するか、IANA を取得してコンパイルする必要がある場合があります。コード。(ただし、データ ファイルを手動で解析する必要はありません。)