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);
}
ああ、面白いです。私はRのソースを見てみましょう - 私はRについて聞いたが、まだそれを見ていない。ありがとう! +1 :)かゆい感じは、潜在的に他のスレッドが存在する可能性が高いため、私の素朴なコードはマルチスレッド環境でバグを起こす可能性があります。 –
最後にそれを見る時間がありました - 素晴らしい。参照ありがとう、それは完全に質問に答えます。 –
コード例は良い貢献だろう。興味のある他の人に時間を節約するために、それをどうやって貼り付けることができますか?私は素晴らしいだろう。 – NickSoft