Очевидно, что имеется два пути:
- Преобразовать данные структуры в datetime при помощи StructToTime(), отнять/добавить нужное количество секунд и затем преобразовать обратно при помощи TimeToStruct(). В коде будет выглядеть изящно - три строки. По производительности - нужно замерять. В С++ такое делал, тормозов не заметил.
- Написать функцию для отнимания/добавления времени без преобразования к datetime. Строк кода больше, чем три, выглядит некрасиво, но по производительности точно будет быстрым.
Очевидно, что имеется два пути:
- Преобразовать данные структуры в datetime при помощи StructToTime(), отнять/добавить нужное количество секунд и затем преобразовать обратно при помощи TimeToStruct(). В коде будет выглядеть изящно - три строки. По производительности - нужно замерять. В С++ такое делал, тормозов не заметил.
- Написать функцию для отнимания/добавления времени без преобразования к datetime. Строк кода больше, чем три, выглядит некрасиво, но по производительности точно будет быстрым.
Согласен. Вариант здесь два.
1-ый, как я вижу более удобный и быстрый. Ведь операции лишь две (умножить количество требуемого интервала времени на размер её в секундах, а далее отнять всё это хозяйство от изначального времени в формате datetime).
2-ой вариант буде тболее не удобный. Я о нём думал. Придётся писать либо перегруженные методы, либо не перегруженные, но проверять какой интервал времени пришёл в аргументы (день, час, минута.. и .тд.) и далее, в зависимости от этого отнимать еденицу от большего интервала (если он присутствует) и тд. Это как-бы не удобно и долго писать. Всё просто по логике, но писанины больше и код выйдет длинный.
Остановлюсь, пожалуй, на 1-ом варианте.

- 2007.02.05
- www.mql5.com
Физически структура - строка. В определённые позиции (байты) этой строки записаны значения дней, часов, минут и секунд.
Никто не мешает скопировать структуру в строку и изменить эти значения, ну а после - вернуть на место.
Физически структура - строка. В определённые позиции (байты) этой строки записаны значения дней, часов, минут и секунд.
Никто не мешает скопировать структуру в строку и изменить эти значения, ну а после - вернуть на место.
Это не удобно. К тому же не эффективно в плане производительности. Если пойти дальше, то это не оптимально, в плане того, что нет возможности добавить параметр того же таймфрейма и, в зависимости, от переданного таймфрейма отнимать / прибавлять нужное количество секунд,. минут.. дней.. и тд.
Мне кажется, время эффективнее хранить в datetime, а в структуры преобразовывать лишь в редкие моменты вывода/обработки/анализа.
А вы представьте, что вам нужно отнять, например, 3 секунды от времени. Причём секунд должно быть всегда 0 в конце. Например, вот такое время у нас сейчас:
2020.12.31 23:58:27
нам нужно, что бы от 2020.12.31 23:58:00 отнять 3 секунды. Т.е. должно получится 2020.12.31 23:57:57
Если мы будем отнимать от переменной типа datetime, то откуда нам знать сколько отнять секунд, чтобы их было 0 ? А может быть не секунд, а минут и тд.
Вот в таких случаях, лучше использовать структуру. А так да.. Проще работать с обычным datetime, без написания обёрток. Иначе приходится писать код, которой сложнее, хотя и элегантнее выглядит, на самом деле.
Дык, там уже накрученная структура, автор сам себя загнал в угол. Простые решения теперь не катят.
Физически структура - строка. В определённые позиции (байты) этой строки записаны значения дней, часов, минут и секунд.
Никто не мешает скопировать структуру в строку и изменить эти значения, ну а после - вернуть на место.
Структура - это не строка!
Откуда Вы это взяли?
Это не удобно. К тому же не эффективно в плане производительности. Если пойти дальше, то это не оптимально, в плане того, что нет возможности добавить параметр того же таймфрейма и, в зависимости, от переданного таймфрейма отнимать / прибавлять нужное количество секунд,. минут.. дней.. и тд.
А вы представьте, что вам нужно отнять, например, 3 секунды от времени. Причём секунд должно быть всегда 0 в конце. Например, вот такое время у нас сейчас:
нам нужно, что бы от 2020.12.31 23:58:00 отнять 3 секунды. Т.е. должно получится 2020.12.31 23:57:57
Если мы будем отнимать от переменной типа datetime, то откуда нам знать сколько отнять секунд, чтобы их было 0 ? А может быть не секунд, а минут и тд.
Вот в таких случаях, лучше использовать структуру. А так да.. Проще работать с обычным datetime, без написания обёрток. Иначе приходится писать код, которой сложнее, хотя и элегантнее выглядит, на самом деле.
И в чём проблема? Запустите этот скрипт
/********************Script program start function*******************/ void OnStart() { datetime time = D'2020.12.31 23:58:27'; Print(time-time%60-3); }/*******************************************************************/
и почитайте
2021.01.02 11:08:36.069 !00 (EURUSD,M15) 2020.12.31 23:57:57

- Бесплатные приложения для трейдинга
- 8 000+ сигналов для копирования
- Экономические новости для анализа финансовых рынков
Вы принимаете политику сайта и условия использования
Добрый вечер. Возник у меня вопрос интересный.
Я некоторое время пользуюсь своей структурой для работы со временем. Сегодня появилась необходимость в новой возможности, которой у меня не было ранее. Вот начал писать..
В других языках на которых я писал, это делается иначе. В МКЛ другой подход. Объясню подробнее.
Нужна возможность как-то из структуры со временем вычитать какое-то количество (минут, секунд, часов и т.д.) и получать структуру, которая получается на выходе.
Например, имеется время: 10 часов 30 минут 00 секунд
Если отнять 1 секунду, должно получиться 10 часов 29 минут 59 секунд
Я вижу, как это сделать более костыльно и неизящно. Но мне этот вариант не нравится. Можно ли как-то реализовать такую возможность более универсально? Если кому интересно как у меня реализована структура для работы со временем, я её прикрепляю к этому сообщению.