Note that there are some explanatory texts on larger screens.

plurals
  1. POGeneral way to manipulate the times (between timezones) in C?
    primarykey
    data
    text
    <p>After writing a sample code for the question about <a href="https://stackoverflow.com/questions/1173578/converting-between-timezones-in-c">converting between timezones</a>, one of the comments to it was the need for more general method for converting from timezone A to timezone B. I was curious myself too to have a more high-level primitives for such a manipulations, so I wrote the below code.</p> <p>One drawback I see is that it constantly wiggles the TZ in the environment variables, changing the notion of 'local time'. While it seems to work (though I did not check on how it react to the DST periods, but since it's based on the Olson database, presumably it should), I was curious if anyone might have some better ideas on how to deal with this task ? </p> <pre><code>#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #include &lt;sys/time.h&gt; time_t utc_now() { struct timeval tv_utc; gettimeofday(&amp;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(&amp;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(&amp;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(&amp;tm2, "Europe/Brussels"); printf("Brussels time: %s", asctime(&amp;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); } </code></pre>
    singulars
    1. This table or related slice is empty.
    plurals
    1. This table or related slice is empty.
    1. This table or related slice is empty.
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload