• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы SNike
  • Дата начала
S

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 пока тоже не решил т.к. не определился с реализацией данной функции.

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

DIR3ct0r

Код:
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;
 
L

LAW

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

Удачи.
 
M

morpheus

<!--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]
:( ДА ШТО ВЫ ГАВАРИТЕ... а вот разработчики из борланда , наивные , полагали иначе
TDateTime represents a date-and-time value in the Delphi language.

Unit

System

Delphi syntax:

type TDateTime = type Double;

Description

Most CLX objects represent date and time values using a TDateTime value. In Delphi, TDateTime is a type that maps to a Double. In C++, the TDateTime class corresponds to the Delphi TDateTime type.

The integral part of a Delphi TDateTime value is the number of days that have passed since 12/30/1899. The fractional part of the TDateTime value is fraction of a 24 hour day that has elapsed.

Following are some examples of TDateTime values and their corresponding dates and times:

0 12/30/1899 12:00 am
2.75 1/1/1900 6:00 pm
-1.25 12/29/1899 6:00 am
35065 1/1/1996 12:00 am
To find the fractional number of days between two dates, simply subtract the two values, unless one of the TDateTime values is negative. Similarly, to increment a date and time value by a certain fractional number of days, add the fractional number to the date and time value if the TDateTime value is positive.
When working with negative TDateTime values, computations must handle time portion separately. The fractional part reflects the fraction of a 24-hour day without regard to the sign of the TDateTime value. For example, 6:00 am on 12/29/1899 is –1.25, not –1 + 0.25, which would be –0.75. There are no TDateTime values between –1 and 0.

Note: Delphi 1.0 calculated the date from year 1 instead of from 1899. To convert a Delphi 1.0 date to a TDateTime value in later versions of the Delphi language, subtract 693594.0 from the Delphi 1.0 date.
 
L

LAW

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

DIR3ct0r

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

SNike

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

DIR3ct0r

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

SNike

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

DIR3ct0r

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

SNike

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

Обучение наступательной кибербезопасности в игровой форме. Начать игру!