Помогите — совсем запутался
Мне нужно получить UTC в формате time_t, для этих целей всегда пользовался функцией time(), Но вот например, если вывести то что возвращает эта функция (не переводя значение в календарное время) и вывести то что возващает MySQL на запрос SELECT UNIX_TIMESTAMP(UTC_TIMESTAMP()); получаются разные значения... почему?
Здравствуйте, Shmakov, Вы писали:
S>Насколько разные =) Там с точностью до секунд =)))) может время прошло...
S>А вообще — может там с учетом локали и без? time выдает время по GMT, а база — зависит от настроек...
разница как раз составляет смещение от GMT, тоесть получается что или time или mysql выдаёт метку локального временя
К стати.. GMT это одно и тоже UTC?
ЗЫ где можно посмотреть настройки базы?... и настройки ОС (FreeBSD) в части времени?
Здравствуйте, Alex Kirhenshtein, Вы писали:
AK>Здравствуйте, srg984, Вы писали:
S>>>А вообще — может там с учетом локали и без? time выдает время по GMT, а база — зависит от настроек...
AK>time() зависит от локейла, вам нужен gmtime()
а как проверить этот "локейл"? потому что по манам, time возвращает UTC... аgmtime — переводит в календарное время (опять же по манам) не делая выравнивания времени относительно часового пояса...
вот... задача то простая... нужно получить с-ишными функциями временную метку с GMT 0 ... но как то вот не понятно мне...
Ох. Торможу нещадно. Да, time отдает секунды с UTC. gmtime() это аналог localtime() — но не производит конвертации.
По теме:
UNIX_TIMESTAMP(), UNIX_TIMESTAMP(date)
If called with no argument, returns a Unix timestamp (seconds since '1970-01-01 00:00:00' UTC) as an unsigned integer. If UNIX_TIMESTAMP() is called with a date argument, it returns the value of the argument as seconds since '1970-01-01 00:00:00' UTC. date may be a DATE string, a DATETIME string, a TIMESTAMP, or a number in the format YYMMDD or YYYYMMDD. The server interprets date as a value in the current time zone and converts it to an internal value in UTC. Clients can set their time zone as described in Section 5.11.8, “MySQL Server Time Zone Support”.
Здравствуйте, srg984, Вы писали:
S>ЗЫ где можно посмотреть настройки базы?... и настройки ОС (FreeBSD) в части времени?
Раз FreeBSD, то не используйте time(). Он считается устаревшим.
Используйте gettimeofday() или clock_gettime().
Первое — библиотечная функция и возвращает структуру, где первый элемент long,
воторое — системный вызов и возвращет структуру, где первый элемент time_t.
В обоих случях это — кол-во сек. с начала эпохи, НО всё равно с учетом часового пояса.
Однако, если Вы далее с этим time_t хотите как-то работать и подразумевать, что это кол-во секунд по UTC, то можно просто установить переменную окружения TZ в значение UTC0, и тогда функции типа strftime будут возвращать время, соотв. GMT (UTC).
Если же вам нужно чисто получить то значение time_t, которое в поясе GMT, то наверное можно воспользоваться
long tm_gmtoff; /* offset from UTC in seconds */ (struct tm, который возвращается функциями типа localtime, gmtime).
Но только при этом не устанавливайте TZ.
А вообще, решение найти легко, если рассматривать конкретную задачу.
В данном случае просто непонятно, зачем Вам нужно time_t