Уменьшение времени на заданное количество

Viktar Dzemikhau  

Добрый вечер. Возник у меня вопрос интересный.

Я некоторое время пользуюсь своей структурой для работы со временем. Сегодня появилась необходимость в новой возможности, которой у меня не было ранее. Вот начал писать..

В других языках на которых я писал, это делается иначе. В МКЛ другой подход. Объясню подробнее.

Нужна возможность как-то из структуры со временем вычитать какое-то количество (минут, секунд, часов и т.д.) и получать структуру, которая получается на выходе.

Например, имеется время: 10 часов 30 минут 00 секунд

Если отнять 1 секунду, должно получиться  10 часов 29 минут 59 секунд

Я вижу, как это сделать более костыльно и неизящно. Но мне этот вариант не нравится. Можно ли как-то реализовать такую возможность более универсально? Если кому интересно как у меня реализована структура для работы со временем, я её прикрепляю к этому сообщению.

Файлы:
Ihor Herasko  

Очевидно, что имеется два пути:

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

Очевидно, что имеется два пути:

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

Согласен. Вариант здесь два.

1-ый, как я вижу более удобный и быстрый. Ведь операции лишь две (умножить количество требуемого интервала времени на размер её в секундах, а далее отнять всё это хозяйство от изначального времени в формате datetime).

2-ой вариант буде тболее не удобный. Я о нём думал. Придётся писать либо перегруженные методы, либо не перегруженные, но проверять какой интервал времени пришёл в аргументы (день, час, минута.. и .тд.) и далее, в зависимости от этого отнимать еденицу от большего интервала (если он присутствует) и тд. Это как-бы не удобно и долго писать. Всё просто по логике, но писанины больше и код выйдет длинный.

Остановлюсь, пожалуй, на 1-ом варианте.

Edgar Akhmadeev  
Мне кажется, время эффективнее хранить в datetime, а в структуры преобразовывать лишь в редкие моменты вывода/обработки/анализа.
Алексей Тарабанов  

Физически структура - строка. В определённые позиции (байты) этой строки записаны значения дней, часов, минут и секунд. 

Никто не мешает скопировать структуру в строку и изменить эти значения, ну а после - вернуть на место. 

Viktar Dzemikhau  
Алексей Тарабанов:

Физически структура - строка. В определённые позиции (байты) этой строки записаны значения дней, часов, минут и секунд. 

Никто не мешает скопировать структуру в строку и изменить эти значения, ну а после - вернуть на место. 

Это не удобно. К тому же не эффективно в плане производительности. Если пойти дальше, то это не оптимально, в плане того, что нет возможности добавить параметр того же таймфрейма и, в зависимости, от переданного таймфрейма отнимать / прибавлять нужное количество секунд,. минут.. дней.. и тд.


Edgar Akhmadeev:
Мне кажется, время эффективнее хранить в 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, без написания обёрток. Иначе приходится писать код, которой сложнее, хотя и элегантнее выглядит, на самом деле.

Алексей Тарабанов  
Aliaksandr Hryshyn:
Так просто отнимите 3 от переменной типа datetime

Дык, там уже накрученная структура, автор сам себя загнал в угол. Простые решения теперь не катят. 

Koldun Zloy  
Алексей Тарабанов:

Физически структура - строка. В определённые позиции (байты) этой строки записаны значения дней, часов, минут и секунд. 

Никто не мешает скопировать структуру в строку и изменить эти значения, ну а после - вернуть на место. 

Структура - это не строка!

Откуда Вы это взяли?


Alexey Viktorov  
Viktar Dzemikhau:

Это не удобно. К тому же не эффективно в плане производительности. Если пойти дальше, то это не оптимально, в плане того, что нет возможности добавить параметр того же таймфрейма и, в зависимости, от переданного таймфрейма отнимать / прибавлять нужное количество секунд,. минут.. дней.. и тд.


А вы представьте, что вам нужно отнять, например, 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
Причина обращения: