Периоды и временной интервал (tdatetime)

Тема в разделе "Delphi - FAQ", создана пользователем SNike, 22 ноя 2006.

  1. SNike

    SNike Гость

    Суть темы такова:
    1. Есть некий временной интервал, скажем с T1 по T2 (T1, T2: TDateTime)
    2. Этот интервал выглядит как 7.11.01, 8.11.01, 9.11.01, 10.11.01, 11.11.01, 12.11.01
    3. По всем элементам интервала пробегаемся переменной, например, Tcur: TDateTime;
    4. Задана определенная периодичность P, равная, скажем 2 дням
    5. С заданной периодичностью требуется что-то делать.

    Пример:
    Для указанного в п.2 ряда и с P = 2 дня нужно 8.11.01, 10.11.01, 12.11.01 вывести сообщение MessageBox('Эта дата соответствует периодичности равной 2 дням');

    Исходными данными являются T1 - начало периода, Tcur - принимающая поочередно значения ряда, Period - заданный период, и он может быть например, 1 минута, 1 час, 12 часов и т.п.
    Вопрос в том как получше реализовать проверку того, пора ли выводить это сообщение или нет.

    Иными словами это функция следующиего вида:
    Function IsPeriod(T1, Tcur: TDateTime; Period: ???): Boolean

    В каком виде хранить Period пока тоже не решил т.к. не определился с реализацией данной функции.

    Поделитесь своими мыслями на этот счет, буду весьма признателен
     
  2. DIR3ct0r

    DIR3ct0r Гость

    Код (Text):
    PeriodType = (pMinute, pHour, pDay...);
    TPeriod = record
    Value: integer;
    Typ: PeriodType;
    end

    Function IsPeriod(T1, Tcur: TDateTime; Period: TPeriod): Boolean;
    var
    DTPeriod: TDateTime;
    begin
    case Period.Typ of
    pMinute: DTPeriod:= EncodeTime(0, Period.Value, 0, 0);
    pHour: DTPeriod:= EncodeTime(Period.Value, 0, 0, 0);
    pDay: DTPeriod:= Period.Value;
    ...
    end;
    Result:= Tcur - T1 >= DTPeriod;
    end;
     
  3. LAW

    LAW Гость

    Даты в Дельфях и Билдерах (не зенаю как в VC++) хранятся и в основном используются в виде integer. Отсчёт идёт от начала прошлого века. Поэтому реализация предельна проста: например из TDateTimePicker берёш значение AsDateTime в integer и анализируешь число. Если нужно каждое чётное, значит берёшь чётное. Конвертация что бы показать пользователю фунуцией Format().

    Удачи.
     
  4. morpheus

    morpheus скриптописец

    Регистрация:
    7 авг 2006
    Сообщения:
    3.927
    Симпатии:
    0
    <!--QuoteBegin-LAW+28:11:2006, 08:51 -->
    <span class="vbquote">(LAW @ 28:11:2006, 08:51 )</span><!--QuoteEBegin-->хранятся и в основном используются в виде integer
    [snapback]49084" rel="nofollow" target="_blank[/snapback]​
    [/quote]
    :( ДА ШТО ВЫ ГАВАРИТЕ... а вот разработчики из борланда , наивные , полагали иначе
     
  5. LAW

    LAW Гость

    Секундочку!
    Мы говорим про дату, а не про дату и время.
    Вы не увидели начала моего сообщения: "Даты в Дельфях и Билдерах (не зенаю как в VC++)"
    Если нужно и время, тогда нужна переменная с дробной частью.
     
  6. DIR3ct0r

    DIR3ct0r Гость

    Уважаемый, Law, внимательней читайте вопрос
    и чего следует, что период не обязательно дата, а может быть и время!
     
  7. SNike

    SNike Гость

    Да, тут нужно учитывать и время, т.к. периодичность может быть разной. Я делал по тому же принципу что и в посте №2, но проблема возникла именно с периодом типа "время". Вот с ним то у меня получился неоптимальный и не слишком-то быстрый код, потому и прошу руки помощи в реализации такой функции вообще, чтоб по возможности полностью переделать её в лучшую сторону
     
  8. DIR3ct0r

    DIR3ct0r Гость

    Почему не оптимальный то?....арифметические операции типа вычитания и ф-я EncodeTime не оптимальные?....бред какой-то....
     
  9. SNike

    SNike Гость

    Нет, я не о том. Это у меня код получился не совсем оптимальный, тут-то как раз все нормально
     
  10. DIR3ct0r

    DIR3ct0r Гость

    Я же написал тебе пример как реализовать функцию, что не получается то?
     
  11. SNike

    SNike Гость

    Пока все в норме, погоняем дальше, т.к. используется полный DateTime, включая миллисекунды.
    Спасибо
     

Поделиться этой страницей