C/C++で現地時間とUTCの間で日付時刻を変換する最良の方法は何ですか?
「datetime」とは、日付と時刻を含む時間表現を意味します。私はtime_t
、struct tm
、またはそれを可能にするその他の表現。
私のプラットフォームはLinuxです。
ここに私が解決しようとしている特定の問題があります:ユリウス暦の日付とその日の秒数を含む値のペアを取得します。これらの値はGMTです。それをローカルタイムゾーンの「YYYYMMDDHHMMSS」値に変換する必要があります。ジュリアンの日付をY-M-Dに変換する方法を知っています。明らかに秒をHHMMSSに変換するのは簡単です。ただし、トリッキーな部分はタイムゾーン変換です。私は解決策を見つけられると確信していますが、つまずくのではなく、「標準」または「よく知られた」方法を見つけたいと思います。
関連する可能性のある質問は Cのタイムゾーンの夏時間移行日を取得する です。
gmtime
/localtime
とtimegm
/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
_を変更する必要があります。
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);
または類似のもの...
タイムゾーンルールを使用して日付/時刻を変換する必要がある場合は、 [〜#〜] icu [〜#〜] を調べてください。