MqlDateTime dt; datetime DT; DT=TimeCurrent(); TimeToStruct(DT,dt); dt.day=dt.day-20; DT=StructToTime(dt); Print(DT);
Предложенный вариант решения не учитывает хронологические моменты. И, по большому счёту, работает некорректно, на мой взгляд.
Если, допустим,
MqlDateTime dt_struct; TimeCurrent (dt_struct); Print (StructToTime(dt_struct));
даёт на выходе '2011.11.15 12:15:01', то
MqlDateTime dt_struct; TimeCurrent (dt_struct); dt_struct.day = dt_struct.day - 20; Print (StructToTime(dt_struct));
даёт '2011.11.01 12:15:01'.
Т. е. если количество отнимаемых дней превышает число дней до начала месяца, то мы в любом случае получаем дату начала месяца.
Интересует же функция, учитывающая количество дней в месяце, году и т. п. Собственно, можно ли это сделать как-то иначе, нежели описанный в оп-посте вариант с преобразованиями в datetime и обратно?
посмотрите по ссылке на пост выше. там и есть ответ.
посмотрите по ссылке на пост выше. там и есть ответ.
В посте по ссылке предложено два решения:
1. Отнять количество секунд от переменной типа datetime;
2. Отнять количество дней от поля day структуры типа MqlDateTime (оно приведено в первом отрывке кода).
Если мы применяем второй вариант, то можем отнять только количество дней, меньшее, чем значение, содержащееся в поле day. Эту мысль я отразил в приведённом примере. Проще говоря, если сегодня 15 ноября, то если мы отнимем число больше 14 - в любом случае получим 1 ноября.
Объективно, если мы отнимаем от 15 ноября 15 дней, то должны получить 31 октября. Нет?
- www.mql5.com
В посте по ссылке предложено два решения:
1. Отнять количество секунд от переменной типа datetime;
2. Отнять количество дней от поля day структуры типа MqlDateTime (оно приведено в первом отрывке кода).
Если мы применяем второй вариант, то можем отнять только количество дней, меньшее, чем значение, содержащееся в поле day. Эту мысль я отразил в приведённом примере. Проще говоря, если сегодня 15 ноября, то если мы отнимем число больше 14 - в любом случае получим 1 ноября.
Объективно, если мы отнимаем от 15 ноября 15 дней, то должны получить 31 октября. Нет?
Есть предположение, что второй вариант в старых билдах работал и на больших вычетах по времени.
Но сейчас остался только первый:
datetime dt = TimeCurrent() - PeriodSeconds(PERIOD_D1)*20; Print(TimeToString(TimeCurrent(), TIME_DATE|TIME_MINUTES)," - ", TimeToString(dt, TIME_DATE|TIME_MINUTES));
В посте по ссылке предложено два решения:
1. Отнять количество секунд от переменной типа datetime;
2. Отнять количество дней от поля day структуры типа MqlDateTime (оно приведено в первом отрывке кода).
Если мы применяем второй вариант, то можем отнять только количество дней, меньшее, чем значение, содержащееся в поле day. Эту мысль я отразил в приведённом примере.
Используйте первое решение - не ошибетесь.
Есть предположение, что второй вариант в старых билдах работал и на больших вычетах по времени.
Но сейчас остался только первый:
Что-то мне тоже подсказывает, что сперва второе решение работало. Собственно, поэтому и выбрал сейчас первое, чтобы не зависеть от подобных неожиданностей) Спасибо!
а если мы применяем первый вариант? то что будет?
Будет преобразование типов взад-вперёд, что на мой взгляд не лучшим образом может сказаться на производительности в определённой ситуации. Хотя в данный момент я ушёл от этой проблемы алгоритмически. Просто перегрузка простейших арифметических операций для работы с датами была бы приятным дополнением к остальным нововведениям в MQL5)
- www.mql5.com
- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Как оптимальнее организовать изменение структуры типа MqlDateTime? В простейшем случае на +/- 1 день. Само собой, с проверкой переходов через месяц/год.
Будет ли быстрее проверить граничные состояния (30, 31, 01 числа), чем 1) провести преобразование в datetime -> 2) преобразованное значение увеличить на 86400 -> 3) произвести обратное преобразование к MqlDateTime?
Ну и в общем случае - изменение на произвольное количество любых единиц (секунд, минут, часов и т. д.).