LINUX.ORG.RU

Разница между UTC и локальной таймзоной

 , , ,


0

2

Делал так, на час ошибается. Но localtime() работает правильно. Почему?

#include <stdio.h>
#include <time.h>

extern long timezone;

int main(void) {
	tzset();
	printf("%ld\n", timezone);
	return 0;
}


Последнее исправление: suuaq (всего исправлений: 1)

Делал так, на час ошибается.

У меня не ошибается.

Но localtime() работает правильно. Почему?

У вас, наверное, неправильно настроено время. Проверьте расхождение с каким-нибудь сервером времени (ntpdate -uq ntp.ubuntu.com)

Sorcerer ★★★★★
()

мимопроходя: а файл временных зон является корректным?

$ date
$ date -u

Atlant ★★★★★
()

Вероятно у тебя таймзона без учета на летнего времени.

Jetty ★★★★★
()

tm_gmtoff показывает правильно, но не стандарт.

$ cat test.c && gcc -o test test.c && ./test
#include <stdio.h>
#include <time.h>

extern char *tzname[2];
extern long timezone;
extern int daylight;

int main(void) {
	tzset();

	time_t mytime = time(NULL);

	struct tm utc;
	gmtime_r(&mytime, &utc);

	struct tm local;
	localtime_r(&mytime, &local);

	printf("tzname[0]:       %s\n", tzname[0]);
	printf("tzname[1]:       %s\n", tzname[1]);
	printf("timezone:        %ld\n", timezone);
	printf("daylight:        %d\n", daylight);
	printf("local:           %s", asctime(&local));
	printf("utc:             %s", asctime(&utc));
	printf("local.tm_gmtoff: %ld\n", local.tm_gmtoff);
	printf("utc.tm_gmtoff:   %ld\n", utc.tm_gmtoff);

	return 0;
}
tzname[0]:       CET
tzname[1]:       CEST
timezone:        -3600
daylight:        1
local:           Thu May  7 10:23:38 2015
utc:             Thu May  7 08:23:38 2015
local.tm_gmtoff: 7200
utc.tm_gmtoff:   0
suuaq
() автор топика
Ответ на: комментарий от suuaq

POSIX сообщает, что переменная timezone хранит разницу между UTC и обычным локальным временем (local standard time). Т.е. летнее время - необычное. Фактически, нет смысла использовать переменную timezone. Лучше использовать tm_gmtoff. Даже на системах, где tm_gmtoff отсутствует, его относительно легко всё равно заполучить (я делал библиотечку для этого пару лет назад).

Sorcerer ★★★★★
()
Ответ на: комментарий от Sorcerer

Лучше использовать tm_gmtoff. Даже на системах, где tm_gmtoff отсутствует, его относительно легко всё равно заполучить (я делал библиотечку для этого пару лет назад).

Подробнее?

suuaq
() автор топика
Ответ на: комментарий от suuaq

UNIX-системы используют tzdata (timezone database). Код для работы с этой базой доступен тут: ftp://ftp.iana.org/tz/ . Этот код имеет поддержку tm_gmtoff, и его легко можно использовать вместо localtime(). Я проверял на солярке.

Sorcerer ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.