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

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

SNike

#1
Суть темы такова:
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

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

Удачи.
 

morpheus

скриптописец
07.08.2006
3 915
1
#4
<!--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
#5
Секундочку!
Мы говорим про дату, а не про дату и время.
Вы не увидели начала моего сообщения: "Даты в Дельфях и Билдерах (не зенаю как в VC++)"
Если нужно и время, тогда нужна переменная с дробной частью.
 
D

DIR3ct0r

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

SNike

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

DIR3ct0r

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

SNike

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

DIR3ct0r

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

SNike

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