Запутался в преобразованиях времени. Помогите распутаться.

 
Запутался в преобразованиях времени. Помогите распутаться.
Я засомневался в правильности преобразований времени ctm, которое получаю через API.

Как я понял это не GMT и не GMT+1, а локальное время БК. Это действительно так?

Но MetaQuotes Software посоветовали для преобразования пользоваться функцией gmtime(&ctm), которая преобразует это значение в GMT. Беда в том, что эта функция считает входное значение локальным временем моего компа и берет за основу глобальную переменную _timezone = -10800(3 часа), а время БК Alpari имеет смещение 2 часа (MSK-1). У других компаний другое.

Вопрос.
Значит для каждой компании, перед преобразованием времени, нужно инициализировать _timezone соответствующим смещением???
Причем не принятым в MetaTraider API смещением относительно GMT+1, а нормальным смещением относительно GMT. Иначе просто будет ошибка, некорректное преобразование, Ибо Си не знает про Метатрейдер! Это смещение нигде явно не указывается, его нужно определять пользователю самостоятельно своими средствами.

Или все-таки правильнее использовать localtime(&ctm), которая оставит первоначальное значение времени БК без изменений?
Кроме того, именно это локальное время БК требуется в функциях МТАПИ для получения истории.

Если кто в курсе, подтвердите или опровергните правильность этих соображений.
 
Но самое поразительное то...
Но самое поразительное то, что при неправильном преобразовании (со смещением 3 часа) gmtime(&ctm) получается время совпадающее с временем Market Watch метатрейдера, для БК со смещением 2 часа. Хотя должно быть по идее, на час больше.
Ведь в Метатрейдере используется не GMT, а GMT+1, и их 2 часа тоже самое что 3 часа по Москве.
С другой стороны было мнение, что там вообще локальное время БК, тогда почему оно совпадает с преобразованным к GMT?
Я что-то совсем запутался.
 
существует ещё понятие зимнего и летнего времени - коррекция на 1 час
 
используйте gmtime(&ctm) в чистом виде и никаких коррекций
Используйте gmtime(&ctm) в чистом виде и никаких коррекций. Это время сервера. Какое время у Вас - не имеет никакого значения. Причем тут таймзоны? Вы работаете по времени _сервера_.
 
Правильно, но Я работаю с несколькими серверами в разных таймзонах
и хотелось бы, чтобы данные с этих серверов были синхронизированы(имели одинаковое время), для этого необходимо знать их таймзоны. Поскольку эта информация нигде не указана, то приходится вычислять на основе своей(известной) таймзоны. Однако, gmtime(&ctm) не даст правильного преобразования если глобальная переменная _timezone не установлена правильно!!! Если получаем данные с сервера из таймзоны 6, то стопудово нужно сделать _timezone=6 * 3600. А если таймзона не известна, то узнать ее на основе оперативного сравнения текущего времени. И так для каждого сервера!

Так по поводу gmtime(&ctm) и localtime(&ctm).
Дело в том, что localtime дает время MSK+1, gmtime дает время GMT+1. Т.е. Разница между этими временами - 3 часа, как и положено в соответствие с глобальной переменной _timezone=3 часа, но Москва и Гринвич сместились на восток на 1 час из-за коррекций на СЕРВЕРЕ. В клиентской части никаких коррекций нет. Правильно?
 
время
Каждый сервер работает в своем времени и все остальные (клиенты, менеджеры и тд) берут за основу именно это время. Если вам нужно работать с множеством серверов(кстати, зачем?), то берите их время и приводите к чему угодно. Почитайте документацию по функциям времени. Мы то тут причем?

Чтобы было совсем понятно:
в gmtime _timezone вообще не участвует! это же работа с UTC time.
в localtime _timezone участвует. кто вам вообще говорит об использовании localtime? только gmtime и все!
 
Я так и понял. Спасибо. Но насчет gmtime и _timezone документация с вами не согласна.
struct tm *gmtime(const time_t *timer);

Description

Converts date and time to Greenwich mean time (GMT).

gmtime accepts the address of a value returned by time and returns a pointer to the structure of type tm containing the time elements. gmtime converts directly to GMT.

The global long variable _timezone should be set to the difference in seconds between GMT and local standard time (in PST _timezone is 8 x 60 x 60). The global variable _daylight should be set to nonzero only if the standard U.S. daylight saving time conversion should be applied.
 
Я просто хочу разобраться. В документации UTC и рядом не стоит с gmtime.
// MetaTraider API документация
struct RateInfo {
time_t ctm; // текущее время в секундах
... }
time_t это current time, in seconds, elapsed since 00:00:00 GMT, January 1, 1970, and stores that value in the location pointed to by timer, provided that timer is not a NULL pointer.

Т.е. чтоб совсем понятно было
Временная зона в формате time_t отсутствует!
***********************************************
UTC Time Format - Совсем не время в секундах
Several clauses defined in this document use the UTC Time format:
YYMMDDHHMMZ
where: YY - last two digits of year
MM - month (01 through 12)
DD - day of month (01 through 31)
HH - hours (00 through 23)
MM - minutes (00 through 59)
Z - the character "Z" denotes Greenwich Mean Time (GMT).

For example, "9502192015Z" represents 8:15pm GMT on 19 February 1995.
****************************************
Между тем, gmtime(const time_t *timer) все же работает со временем в секундах, т.е. не с UTC.

Я не настаиваю, просто так получается по документации.
 
читаем хелп(MSDN) внимательно и не путаем функции gmtime и localtime
gmtime
gmtime returns a pointer to a structure of type tm. The fields of the returned structure hold the evaluated value of the timer argument in UTC rather than in local time.

localtime
localtime corrects for the local time zone if the user first sets the global environment variable TZ. When TZ is set, three other environment variables (_timezone, _daylight, and _tzname) are automatically set as well. See _tzset for a description of these variables. TZ is a Microsoft extension and not part of the ANSI standard definition of localtime.
 
Толи вы слепые, толи глухие. Смотрите не то что возвращает, а то что получает.
То Что возвращает gmtime, к вопросу не относится!!! Т.е. вообще не о том!
Вопрос в том что он получает и как понимает, то что получает.
Выдержки я взял из C++ Builder, т.к. именно на нем пишу.
Ничего от себя не добавлял.

А вот с вашим временем разобраться так и не могу!!!
FinMarket - находится в Киеве MarketWatch = 19 часов
Alpari - находится в Москве MarketWatch = 18 часов
Это, что по вашему GMT+1 ?
Вы утверждали именно это.
Киев на Урал в Вашем MetaTraidere переехал?
 
Короче так дела обстоят...
Как я понял Метатрейдер возвращает вовсе не GMT+1 время, а локальное время, установленное на сервере. То, что оно совпадает с GMT+1 для Alpari (в Москве) говорить только о том, что на данном сервере установили системное время = GMT+1. Т.е. считается что Сервер находится в зоне GMT+1.
Другие сервера возвращают свое локальное время, в чем можно убедиться, скачав их MT-терминалы.
Что нам теперь каждого админа на каждом сервере пытать, какое системное время у него выставлено???