web-dev-qa-db-ja.com

C / C ++での現地時間とGMT / UTC間の変換

C/C++で現地時間とUTCの間で日付時刻を変換する最良の方法は何ですか?

「datetime」とは、日付と時刻を含む時間表現を意味します。私はtime_tstruct tm、またはそれを可能にするその他の表現。

私のプラットフォームはLinuxです。

ここに私が解決しようとしている特定の問題があります:ユリウス暦の日付とその日の秒数を含む値のペアを取得します。これらの値はGMTです。それをローカルタイムゾーンの「YYYYMMDDHHMMSS」値に変換する必要があります。ジュリアンの日付をY-M-Dに変換する方法を知っています。明らかに秒をHHMMSSに変換するのは簡単です。ただし、トリッキーな部分はタイムゾーン変換です。私は解決策を見つけられると確信していますが、つまずくのではなく、「標準」または「よく知られた」方法を見つけたいと思います。


関連する可能性のある質問は Cのタイムゾーンの夏時間移行日を取得する です。

30

gmtime/localtimetimegm/mktimeの組み合わせを使用することになっています。 _struct tm_と_time_t_の間の変換を行うための直交ツールが提供されます。

UTC/GMTの場合:

_time_t t;
struct tm tm;
struct tm * tmp;
...
t = timegm(&tm);
...
tmp = gmtime(t);
_

現地時間の場合:

_t = mktime(&tm);
...
tmp = localtime(t);
_

tzset()は、TZ環境変数から内部タイムゾーン変数を設定します。これが複数回呼び出されるとは思わない。

タイムゾーン間で変換しようとしている場合は、_struct tm_の_tm_gmtoff_を変更する必要があります。

21
Rick C. Petty

Windowsの場合、timegm()を使用できません。

struct tm *tptr;
time_t secs, local_secs, gmt_secs;
time( &secs );  // Current time in GMT
// Remember that localtime/gmtime overwrite same location
tptr = localtime( &secs );
local_secs = mktime( tptr );
tptr = gmtime( &secs );
gmt_secs = mktime( tptr );
long diff_secs = long(local_secs - gmt_secs);

または類似のもの...

17
Robert Cowham

タイムゾーンルールを使用して日付/時刻を変換する必要がある場合は、 [〜#〜] icu [〜#〜] を調べてください。

2
chrish