[delphi] vergelijk tijd met user set tijden

Pagina: 1
Acties:

  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Ik moet de tijd opvragen in delphi en vergelijken of de tijd tussen 9 en 10 uur savonds ligt. Indien dit zo is moet er iets gebeuren, voor het gemak houd ik het effe op een showmessage. Als het niet zo is gebeurt er iets anders.

Op het moment heb ik het zo gedaan.

Delphi:
1
2
3
4
5
6
7
8
if (now > 21.00) and (now < 22.00) then
  begin
    //doe iets
  end
else
  begin
   / /doe iets anders
  end


Het stomme is echter dat als ik het deel

and (now<22.00) weglaat hij altijd zegt dat de tijd > dan 21.00.

Weet iemand een makkelijke manier om de systeem tijd te vergelijken met 2 andere tijden?

  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

Die manier die je nu opgeeft is toch makkelijk?

  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
ja maar die werkt dus niet. if (now > 21.00) geeft altijd true, ook al zet ik de tijd op 20.00 uur. Now omzetten in een variabele helpt ook niet.

Verwijderd

Dat (NOW > 21.00) AND (NOW < 22.00) werkt denk ik ook niet,
IS het niet zo dat de tijd achter de komma staat ? 1 seconde is 1/38400 1/86400 (ofzoiets dacht ik).
Zal het morgen is ff napluizen...

[ Voor 7% gewijzigd door Verwijderd op 09-07-2003 00:43 ]


  • Delphi32
  • Registratie: Juli 2001
  • Laatst online: 22-08 10:56

Delphi32

Heading for the gates of Eden

uhm ja... Now = TDateTime, die loopt van 0 tot weet ik veel, waarbij de gehele getallen de dagen aangeven. Vandaar dat Now > 21.00 altijd True oplevert (dag 21 vanaf het begin van de TDateTime dagtelling :)).
Je moet de Frac van Now pakken en daar wat mee goochelen.

edit:
iets als
Delphi:
1
if (Frac(now) > (21/24)) or (Frac(now) < (22/24)) then...

dus. Frac = het gedeelte achter de komma, en dat representeert de tijd op de dag. 1/24 = 0.04167 = 1 uur. 21/24 = 0.875, da's dus 21:00 uur.

[ Voor 35% gewijzigd door Delphi32 op 09-07-2003 00:31 . Reden: Stupid haakjes op de late avond :) ]


  • André
  • Registratie: Maart 2002
  • Laatst online: 19-08 12:30

André

Analytics dude

In Delphi kun je op deze manier toch ook geen if-statement maken, moet het niet zo ?:

Delphi:
1
2
3
4
5
6
7
8
9
if (now > 21.00) then
  if (now < 22.00) then
    begin
      //doe iets
    end
  else
    begin
     / /doe iets anders
    end

[ Voor 4% gewijzigd door André op 09-07-2003 00:29 ]


  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Zo'n if statement kan wel hoor, dan heb je alleen wel maar de mogelijk om 1 else te doen als er 1 van de 2 dingen niet is voldaan.

Delphi32: Thanx, ik had ook al iets met frac gevonden maar dat was SQL en daar snapte ik niks van.

  • Dommel
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:30

Dommel

Professioneel Software Sloper

is het niet mogelijk om in plaats van now > 21.00 een variable te introduceren, bijv TijdstipNu

Delphi:
1
2
3
4
5
6
7
8
9
10
11
TijdstipNu := FormatDateTime('hh:mm',now); 
// TijdstipNu vooraf declareren als string

if ((TijdstipNu > 21.00)  and (TijdstipNu<22.00)) then
  begin
    // doe iets
  end
else
  begin
    // doe iets anders
  end;


@Andre: waarom zou je op die manier niet een if ... then... else statement mogen maken :? Ik heb het regelmatig zo gedaan en doe het ook regelmatig zo en het werkt allemaal goed.

[ Voor 13% gewijzigd door Dommel op 09-07-2003 00:45 . Reden: lay-out verneuking & typo verwijdert :P ]

Lego Taj Mahal te koop --> https://gathering.tweakers.net/forum/list_messages/2109838


Verwijderd

Probeer dit maar eens:
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
procedure TForm1.Button1Click(Sender: TObject);
var
 uurVanaf, MinutenVanaf, uurTotEnMet, MinutenTotEnMet : integer;
 timeNow,                       
 timeVanaf,
 timeTotEnMet : double;
begin
 uurVanaf        := 00;     // in jouw geval zet je hier 21
 minutenVanaf    := 30;   // in jouw geval zet je hier 00
 uurTotEnMet     := 00;  // in jouw geval zet je hier 22
 minutenTotEnMet := 45; //  in jouw geval zet je hier 00
 timeNow         := FRAC(NOW);         // alleen de tijd overhouden
 timeVanaf    := ((uurVanaf * 3600) + (minutenVanaf * 60)) / 86400;
 timeTotEnMet := ((uurTotEnMet * 3600) + (minutenTotenMet * 60)) / 86400;

 if (timeNOW >= timeVanaf) AND (timeNOW <= timeTotEnMet) then
    showmessage('ok')
 else
    showmessage('niet ok')
end;


1 seconde is dus 1/86400 (en 86400 = 24 * 60 * 60 :) )

[ Voor 19% gewijzigd door Verwijderd op 09-07-2003 00:45 ]


  • Dommel
  • Registratie: Maart 2001
  • Laatst online: 18-08 11:30

Dommel

Professioneel Software Sloper

Verwijderd schreef op 09 July 2003 @ 00:38:
Probeer dit maar eens:

1 seconde is dus 1/86400 (en 86400 = 24 * 60 * 60 :) )
Ik heb even vlug jouw code geprobeerd en hoewel het er allemaal goed uit lijkt te zien levert deze op dit tijdstip toch een 'Ok' op. Dit terwijl de TS er alleen maar 'Ok' uit wil krijgen tussen 21.00 en 22.00 :)
Te vlot geweest. Doet het wel goed |:(

[edit]
Even de code wat netter gemaakt en de complete procedure neergezet :)
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
procedure TForm1.Button1Click(Sender: TObject);
var
  TijdstipNu : string;
begin
TijdstipNu := FormatDateTime('hh:mm',now); 

if ((TijdstipNu > '21.00')  and (TijdstipNu < '22.00')) then
  begin
    showmessage('Ok');
  end
else
  begin
    showmessage('Niet Ok');
  end;
end;

[ Voor 44% gewijzigd door Dommel op 09-07-2003 00:52 ]

Lego Taj Mahal te koop --> https://gathering.tweakers.net/forum/list_messages/2109838


Verwijderd

ChristuS schreef op 09 July 2003 @ 00:48:
[...]

Ik heb even vlug jouw code geprobeerd en hoewel het er allemaal goed uit lijkt te zien levert deze op dit tijdstip toch een 'Ok' op. Dit terwijl de TS er alleen maar 'Ok' uit wil krijgen tussen 21.00 en 22.00 :)
Als je 'm tussen 00.30 en 00.45 heb uitgevoerd, klopt dit ook, kijk even naar
de waarden die ik aan de variabelen meegeef.
uurVanaf := 00;
minutenVanaf := 30;
uurTotEnMet := 00;
minutenTotEnMet := 45;

(heb er ook ff commentaar bijgezet in m'n vorige post)

[edit]
grmbl :)

enne, ik ben er geen voorstander van om berekeningen/vergelijkingen met datum&tijd op basis van strings te doen, vraag me niet waarom, toch ff wat uitleg:
stel je bakt hier een functie van (bv. IsTimeBetween(tNow, tFrom, tTill) : boolean;)
als je dit uit wilt breiden naar gebruik waarbij je over een datum heen loopt dus tussen 23.30 en 01.30 uur zeg maar, zit je me je strings een stuk lastiger, terwijl mijn code zo is aangepast. (enne morgen doe ik ff wat performance testjes :) ).

[ Voor 45% gewijzigd door Verwijderd op 09-07-2003 01:00 ]


Verwijderd

REDFISH schreef op 09 July 2003 @ 00:18:
Ik moet de tijd opvragen in delphi en vergelijken of de tijd tussen 9 en 10 uur savonds ligt. Indien dit zo is moet er iets gebeuren, voor het gemak houd ik het effe op een showmessage. Als het niet zo is gebeurt er iets anders.

Op het moment heb ik het zo gedaan.

Delphi:
1
2
3
4
5
6
7
8
if (now > 21.00) and (now < 22.00) then
  begin
    //doe iets
  end
else
  begin
   / /doe iets anders
  end
Ik raad je aan om maar één keer de functie Now() te gebruiken bij dit soort constructies. Sla het resultaat bijvoorbeeld op in een variabele en ga daar mee rekenen.

Daarnaast is het werkelijke probleem hierboven al ergens beschreven.

voorbeeld #1
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
uses DateUtils,...
 
var
  CurrentDateTime,BeginInterval, EindInterval: TDateTime;
begin
  CurrentDateTime := Now;
  BeginInterval := RecodeTime(CurrentDateTime,21,0,0,0);
  EindInterval := RecodeTime(CurrentDateTime,22,0,0,0);
  if ((SecondSpan(CurrentDateTime,BeginInterval) < (60*60)) and
      (SecondSpan(CurrentDateTime,EindInterval) < (60*60))) then
    begin
      ShowMessage('Hello world');
    end
  else
    begin
    end;
end;


voorbeeld #2
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
Uses DateUtils,...
 
var
  CurrentDateTime,BeginInterval, EindInterval: TDateTime;
begin
  CurrentDateTime := Now;
  BeginInterval := RecodeTime(CurrentDateTime,21,0,0,0);
  EindInterval := RecodeTime(CurrentDateTime,22,0,0,0);
  if ((CompareTime(CurrentDateTime,BeginInterval) = GreaterThanValue) And
    (CompareTime(CurrentDateTime,EindInterval) = LessThanValue)) then
    begin
      ShowMessage('Hello world');
    end
  else
    begin
    end;
end;


voorbeeld #3
Delphi:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
Uses DateUtils,....
 
var
  DaySeconds: LongWord;
begin
  DaySeconds := SecondOfTheDay(Now);
  if ((DaySeconds > (21*60*60)) and (DaySeconds < (22*60*60))) then
    begin
      ShowMessage('Hello world');
    end
  else
    begin
    end;
end;


Voorbeeld #2 is bij nader inzien wel elegant.

[ Voor 21% gewijzigd door Verwijderd op 09-07-2003 02:15 . Reden: Voorbeeld #2 toegevoegd. ]


  • LordLarry
  • Registratie: Juli 2001
  • Niet online

LordLarry

Aut disce aut discede

Zoals sommigen al doorhadden bestaat een TDateTime (en TDate en TTime) uit een datum deel en een tijd deel. Het datum deel is het aanta (hele)l dagen sinds 12/30/1899 en dat is dus het gedeelte voor de komma. Het tijd deel staat achter de komma. \

Kijken of een TDateTime tussen de 21.00 (21) en 22.00 (22) zit betekend dus dat je kijkt of ie tussen 20/01/1900 en 21/01/1900 zit. Niet wat je wilde dus :) Je zal het gedeelte achter de komma moeten vergelijken. Je kan het gedeelte voor de comma er simpel afhalen mbv Frac.

Er is nog een dingetje met tijden waar je op moet letten wat niemand hier nog heeft opgemerkt! Omdat het om een getal achter de komma gaat kan het voorkomen dat twee tijden niet precies hetzelfde getal achter de komma opleveren. Vooral als je deze gaat vergelijken met = kan het vaak voorkomen dat de compiler zegt dat ze niet gelijk zijn terwijl ze dat wel zijn. Een veilige manier om tijden dan te vergelijken is met CompareTime. Helaas zit deze er pas vanaf Delphi 6 in. Als je een oudere versie gebruikt zal je zo'n functie zelf moeten schrijven

We adore chaos because we like to restore order - M.C. Escher


  • REDFISH
  • Registratie: Augustus 2001
  • Laatst online: 13-07 15:20

REDFISH

beetje vreemd en niet lekker

Topicstarter
Weet iemand ook toevallig hoe je de dag kunt achterhalen? want die zit namelijk niet in date. Die wordt berekend ofzo? Dayofweek kan geloof ik al.

[ Voor 11% gewijzigd door REDFISH op 09-07-2003 21:10 ]


  • Tomatoman
  • Registratie: November 2000
  • Laatst online: 17:51

Tomatoman

Fulltime prutser

Vraag:
Weet iemand ook toevallig hoe je de dag kunt achterhalen?
Antwoord:
Dayofweek kan geloof ik al.

Een goede grap mag vrienden kosten.

Pagina: 1