2009-07-23 18 views
6

Cのタイムゾーンの間の時間を変換する必要があります(Linuxの場合は何もそうするでしょう)。Cのタイムゾーン間の変換

私は自分の現在時刻、ローカル時刻、およびUTC時刻を知っていますが、目標時刻のオフセットがあります。私はmktime、gmtime、localtimeなどの関数を使用しようとしていますが、まだそれを理解することはできません。

ありがとうございます。

答えて

5

:あなたのようなものを使用することができますあなたの「ローカル」時刻から「その他」の時刻を取得します。次に、struct tmをカレンダーの時間に変換し、目的の時間のオフセットである所望の秒数を追加し、構造体tmに戻します。

(mktimeの正規化を使用する別のシナリオを説明するために編集されています)

#include <stdio.h> 
#include <stdlib.h> 
#include <time.h> 
#include <sys/time.h> 

int main(int argc, char *argv) { 
    struct timeval tv_utc; 
    struct tm *local_tm, *other_tm; 

    /* 'synthetic' time_t to convert to struct tm for the other time */ 
    time_t other_t_synt; 
    /* Other time is 1 hour ahead of local time */ 
    int other_local_delta = 1*3600; 


    /* the below two lines are just to set local_tm to something */ 
    gettimeofday(&tv_utc, NULL); 
    local_tm = localtime(&tv_utc.tv_sec); 

    printf("Local time: %s", asctime(local_tm)); 

    #ifdef DO_NOT_WRITE_TO_LOCAL_TM 
    other_t_synt = mktime(local_tm) + other_local_delta; 
    #else 
    local_tm->tm_sec += other_local_delta; 
    /* mktime will normalize the seconds to a correct calendar date */ 
    other_t_synt = mktime(local_tm); 
    #endif 

    other_tm = localtime(&other_t_synt); 

    printf("Other time: %s", asctime(other_tm)); 

    exit(0); 
} 
+0

これはうまくいくようです。私はlocal_tm-> tm_sec + = 3600を使用します。 other_t = mktime(local_tm);代わりにmktimeに私のためのすべての正規化の処理をさせてください。 – verma

+0

はい、それもうまくいくはずです - 私はこの例のlocal_tmが指しているメモリが私のコードに属していないので、丁寧にしようとしていて、誰かのメモリに書き込むことを避けようとしていました。 –

+0

それは良い点です。 – verma

0

お使いのオペレーティングシステムは、これをサポートしています。

UNIX由来のOSでは、asctime, asctime_r, ctime, ctime_r, difftime, gmtime, gmtime_r, localtime, localtime_r, mktime, timegmのマニュアルページを参照してください。

+1

あなたが言及しているPosixのAPIは、実際には質問の内容を明らかにする方法を提供していません。これらの関数の名前はすでに名前で述べられているので、それらを再度記述し、マニュアルページを指すことは基本的には有用な答えとは言えません。 –

2

オフセットを知っていれば、gmtime()とtm構造体を使って直接設定することができます。

現地時間とUTCを知っている場合は、ローカルオフセットが分かります。ターゲットのオフセットも知っていれば、tm_hourを適切​​に設定するだけです(また、<または> 23になると、1日も反転する可能性があります)。

いくつかのサンプルコードについては、gmtime reference pageを参照してください。タイムゾーンオフセットに基づいてオフセットを示します。


編集:コメントに応えて

- あなたはまた、mktime関数を使用すると、time_t型に戻って変換することによって、これを簡素化することができますあなたのためのシフトを、処理させることができます。コメントは別の答えとして投稿し、コードを掲示することができないので、あなたが「ローカル」時間と「UTC」の時間を知っている場合、あなたは "のオフセットを計算することができます。..

time_t currentTime; 
tm * ptm; 
time (&currentTime); 
ptm = gmtime (&rawtime); 
ptm->tm_hour += hours_to_shift; 
ptm->tm_minutes += minutes_to_shift; // Handle .5 hr timezones this way 

time_t shiftedTime = mktime(ptm); 
// If you want to go back to a tm structure: 

tm * pShiftedTm = gmtime(&shiftedTime); 
+2

FWIW、tm_hourだけでなく、インドの標準時(IST)はUTC + 5.5です。 –

+0

はい、trueです。ほとんどすべてのフィールドを操作する必要がありますが、コンセプトは健全です。 –

+0

実際には、手動であまりにも多くの手作業をすることを避ける方法があると思います。コメントがコードを許可しないので、別の答えとして投稿します。 –

関連する問題