PDA

Просмотр полной версии : [Вопрос] Функция gettime();



punkochel
21.10.2020, 07:27
Как работает функция gettime?
gettime() - возвращает текущее UNIX-время, тут никаких вопросов, все верно, время по Гринвичу.
gettime(hour, minute, second) возвращает уже МСК время, получается второй вариант берет данные с локализации на которой запущен сервер?


main() {

new hour, minute, second;
gettime(hour, minute, second);
printf("Time: %02i:%02i:%02i", hour, minute, second); // Result: Time: 06:36:06 (UNIX: 1603262166)

printf("Unix-Time: %i", gettime()); // Result: Unix-Time: 1603251366 (Wed, 21 Oct 2020 03:36:06 GMT)
}

https://i.imgur.com/WQhcf6B.png

Примечание: Мое время: UTC+3 (Moscow);

DeimoS
21.10.2020, 08:46
gettime в обоих случаях возвращает системное время с машины, на которой запущен сервер.

punkochel
21.10.2020, 09:33
В таком случае, тогда как объяснить результаты примера, предоставленного в теме?

DeimoS
21.10.2020, 14:00
Стоило уточнить на какой платформе ты всё это дело запускаешь :)
Проще будет сделать так:
/* gettime(&hour, &minute, &second)
* The return value is the number of seconds since 1 January 1970 (Unix system
* time).
*/
static cell AMX_NATIVE_CALL n_gettime(AMX *amx, cell *params)
{
time_t sec1970;
struct tm gtm;
cell *cptr;

assert(params[0]==(int)(3*sizeof(cell)));

time(&sec1970);

/* on DOS/Windows, the timezone is usually not set for the C run-time
* library; in that case gmtime() and localtime() return the same value
*/
gtm=*localtime(&sec1970);
if (amx_GetAddr(amx,params[1],&cptr)==AMX_ERR_NONE)
*cptr=gtm.tm_hour;
if (amx_GetAddr(amx,params[2],&cptr)==AMX_ERR_NONE)
*cptr=gtm.tm_min;
if (amx_GetAddr(amx,params[3],&cptr)==AMX_ERR_NONE)
*cptr=gtm.tm_sec;

/* the time() function returns the number of seconds since January 1 1970
* in Universal Coordinated Time (the successor to Greenwich Mean Time)
*/
return sec1970;
}
Это исходный код функции из Open SAMP.

Daniel_Cortez
21.10.2020, 15:04
Таки да, возвращаемый timestamp обозначает время в UTC+0, в то время как значения, возвращаемые в параметрах hour, minute и second основываются на местном времени.
Собственно, это и можно увидеть в коде из поста выше: функция time() (https://en.cppreference.com/w/c/chrono/time) получает Unix-время, которое и возвращается из gettime() напрямую, когда время, возвращаемое через hour, minute и second, основывается на результате из функции localtime() (https://en.cppreference.com/w/c/chrono/localtime), которая не только конвертирует timestamp в отдельные временные составляющие, но и корректирует их под настройки часового пояса в системе (просто конверсию выполняет gmtime() (https://en.cppreference.com/w/c/chrono/gmtime)).

P.S.: Добавил примечание об этой особенности в описание функции на wiki: https://wiki.pro-pawn.ru/wiki/Gettime