2009-08-01 17 views
4

converting between timezonesに関する質問のサンプルコードを書いた後、コメントの1つは、タイムゾーンAからタイムゾーンBに変換するためのより一般的な方法の必要性でした。私は自分自身もこのような私は以下のコードを書きました。Cで時間を(タイムゾーンの間で)操作する一般的な方法は?

私が見ている欠点の1つは、環境変数でTZが絶えず動いて、「現地時間」という概念を変えていることです。 DSTの期間にどのように反応するかはチェックしませんでしたが、Olsonデータベースに基づいているため、おそらくそれはすべきです)、これに対処する方法について誰かが良いアイデアを持っているのであれば、私は不思議でした仕事 ?

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

time_t utc_now() { 
    struct timeval tv_utc; 
    gettimeofday(&tv_utc, NULL); 
    return tv_utc.tv_sec; 
} 

void use_tz(char *timezone) { 
    if(timezone) { 
    setenv("TZ", timezone, 1); 
    } else { 
    unsetenv("TZ"); 
    } 
    tzset(); 
} 

time_t utc_from_local_tm(struct tm *local_tm, char *timezone) { 
    time_t utc; 
    use_tz(timezone); 
    utc = mktime(local_tm); 
    return utc; 
} 

struct tm *local_tm_from_utc(time_t utc, char *timezone) { 
    use_tz(timezone); 
    return localtime(&utc); 
} 

int main(int argc, char *argv[]) { 
    struct tm *tm; 
    struct tm tm2; 
    time_t utc, utc2, utc3; 
    utc = utc_now(); 
    tm = local_tm_from_utc(utc, "Europe/Brussels"); 
    printf("Local time in Brussels now: %s", asctime(tm)); 
    utc2 = utc_from_local_tm(tm, "Europe/Moscow"); 
    tm = local_tm_from_utc(utc2, "UTC"); 
    printf("UTC time if the above was the Moscow local time: %s", asctime(tm)); 

    memset(&tm2, sizeof(tm2), 0); 
    /* 13:00:00 on 11 dec 2010 */ 
    tm2.tm_sec = tm2.tm_min = 0; 
    tm2.tm_hour = 13; 
    tm2.tm_mon = 11; 
    tm2.tm_mday = 11; 
    tm2.tm_year = 110; 


    utc3 = utc_from_local_tm(&tm2, "Europe/Brussels"); 
    printf("Brussels time: %s", asctime(&tm2)); 
    tm = local_tm_from_utc(utc3, "Europe/Moscow"); 
    printf("At 13:00:00 on 11 dec 2010 CET the time in Moscow will be: %s", asctime(tm)); 

    exit(0); 
} 

答えて

1

あなたはどのように構造体tmだけでなく、TZ情報のためのchar *の両方を含む新しい構造体を作成については、環境変数バグをTZ情報を保存する場合は?

Rは非常によくこれらの事をするので、私は甘やかされています:

R> now <- Sys.time() 
R> now 
[1] "2009-08-01 17:19:07 CDT" 
R> format(now, tz="Europe/Brussels") 
[1] "2009-08-02 00:19:07" 
R> 

これは、標準のPOSIX機能にはいくつかの拡張/代替品を持っている、ファイルR-2.9.1/srcに/メイン/日時を参照してください。 c(R-2.9.1は現在のリリース)

+0

ああ、面白いです。私はRのソースを見てみましょう - 私はRについて聞いたが、まだそれを見ていない。ありがとう! +1 :)かゆい感じは、潜在的に他のスレッドが存在する可能性が高いため、私の素朴なコードはマルチスレッド環境でバグを起こす可能性があります。 –

+0

最後にそれを見る時間がありました - 素晴らしい。参照ありがとう、それは完全に質問に答えます。 –

+0

コード例は良い貢献だろう。興味のある他の人に時間を節約するために、それをどうやって貼り付けることができますか?私は素晴らしいだろう。 – NickSoft

関連する問題