Я ищу что-то, что, как я полагал, было бы очень простым - учитывая местное время Unix в определенном часовом поясе (указанном в виде строки, например, «Америка/Нью-Йорк»), обратите внимание, что это не по местному времени), получите соответствующее значение времени в GMT. То есть, что-то вдоль линийПреобразование часовых поясов C API на Linux, кто-нибудь?
time_t get_gmt_time(time_t local_time,
const char* time_zone);
Как обманчиво просто, как это кажется, ближе всего я мог бы найти, был следующий фрагмент кода страницы человека timegm в:
#include <time.h>
#include <stdlib.h>
time_t
my_timegm(struct tm *tm)
{
time_t ret;
char *tz;
tz = getenv("TZ");
setenv("TZ", "", 1);
tzset();
ret = mktime(tm);
if (tz)
setenv("TZ", tz, 1);
else
unsetenv("TZ");
tzset();
return ret;
}
Там должен быть лучше, чем это воинственно не потокобезопасная мерзость, не так ли? Правильно??
Хороший вопрос. Вещи на самом деле почти такие плохие. Весь мир, кажется, думает, что вы никогда не будете заинтересованы в том, чтобы делать вид, что находитесь в другом часовом поясе, или вам нужно преобразовать в любой часовой пояс, кроме, возможно, UTC. Это проблема. –
Здесь есть небольшая путаница относительно того, что означают 'time_t' и' struct tm'.Во всех UN * X-подобных системах 'time_t' /' time() 'равно" секундам с «эпохи» (UTC 0:00 01/01/1970), которые могут быть преобразованы в 'struct tm' через 'localtime()' (дающий результат с исправлением по часовому поясу) или 'gmtime()' (дающий результат в UTC), соответственно их реентерабельным версиям. 'mktime()' - обратное, преобразует 'struct tm' в' time_t '. То, что вы закодировали, это просто' mktime() 'в маскировке? –
Меня тоже интересует вопрос безопасности потока. Как конвертировать в/из произвольного часового пояса, не обязательно« текущую »зону, в ** ** потокобезопасный ** способ. Не просто преобразование, но также использование strftime для печати зоны. – netjeff