URL: https://www.opennet.me/cgi-bin/openforum/vsluhboard.cgi
Форум: vsluhforumID9
Нить номер: 5345
[ Назад ]

Исходное сообщение
"перевод времени в часовой пояс"

Отправлено Sergeyka , 15-Апр-06 23:18 
получаю данные,
заполняю struct tm* ptm;
    ptm->tm_sec = 10;
    ptm->tm_min = 20;
    ptm->tm_hour = 1;
    ptm->tm_mday =15;
    ptm->tm_mon = 3;
    ptm->tm_year = 2006 -1900;

далее мона
strftime( time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", ptm );
и тп

люди плз HELP, как корректно перевести полученное время GMT например в Мск часовой пояс,
что бы учесть переходы день/месяц/год/высокосные


Содержание

Сообщения в этом обсуждении
"перевод времени в часовой пояс"
Отправлено DeadMustdie , 16-Апр-06 10:56 
Если время в GMT доступно как time_t, проблема решается тривиально через функцию localtime(). Если же оное время в GMT прибыло разбитым на поля, приходится склеивать его в time_t ручками. Если кто знает стандартную функцию, пожалуйста поделитесь, мне таковая неизвестна.

Идею кода для своей собственной реализации "склеивания" я в своё время взял отсюда:
  http://www.imatix.com/html/sfl/
Кодом поделиться, звиняйте, не могу, часть коммерческой системы.


"перевод времени в часовой пояс"
Отправлено Sergeyka , 17-Апр-06 10:14 
благодарю!

"перевод времени в часовой пояс"
Отправлено Sergeyka , 17-Апр-06 14:29 
наваял:
string gmt_to_local( int year, int mon, int day, int hour, int min, int sec ){
    struct timeval tv;
    struct tm* ptm;
    char time_string[40] = {0};
    string result;
    time_t tmt;
    long tzone;
    int timezone_hours, is_dst;
    extern time_t timezone;

    is_dst = 0;
    gettimeofday(&tv, NULL);
    ptm = localtime(&tv.tv_sec);
    is_dst = ptm->tm_isdst;

    tzone = (-1) * timezone;
    timezone_hours = tzone / 3600;
    timezone_hours += is_dst;

    ptm->tm_year = year - 1900;
    ptm->tm_mon = mon -1;
    ptm->tm_mday = day;
    ptm->tm_hour = hour + timezone_hours;
    ptm->tm_min =  min;
    ptm->tm_sec = sec;

    tmt = mktime( ptm );
    ptm = localtime( &tmt );

    strftime( time_string, sizeof(time_string), "%Y-%m-%d %H:%M:%S", ptm );

    result = time_string;
    return ( result );
}