23. september 2013 - 00:24 Der er 17 kommentarer og
1 løsning

findes inRange(Mytime, TimeMin, TimeMax) ?

HEJ,

Jeg har i et projekt brug for at checke 0m en tid (i time:minutter / hh:mm) er inden for et interval. Sekunder og Msec's er ikke relevante her..

Eksempel: er '16:32' indenfor tidsintervallet '08:00 --> 18:00 '.
(Ja i dette tilfælde)

Prøver jeg Delphi's inRange(Mytime, TimeMin, TimeMAx ) får jeg en syntaksfejl, der siger, at jeg ikke kan bruge InRange med de værdier/ på den måde. (inRange ligger i MATH DCU'en, men jeg tænker på, om der er en inRange(T1,Tmin, Tmax) for tidsværdier i en af de andre DCU'er.

Jeg kan selvfølgelig konvertere MyTime til FLOAT (ditto for de 2 andre) og så teste og det burde virke, men det vil kræve en masse extra kode, jeg helst ville være fri for.) 

Kristian
Avatar billede kroning Nybegynder
23. september 2013 - 00:34 #1
Hvilke variable typer bruger du til de enkelte tider, TDateTime, String eller ..?
Avatar billede hugopedersen Nybegynder
23. september 2013 - 07:54 #2
Mon ikke du skal over i System.DateUtils og kigge
http://docwiki.embarcadero.com/Libraries/XE2/en/System.DateUtils.TimeInRange
Avatar billede The Real Yoda Juniormester
23. september 2013 - 08:14 #3
Nu kender jeg ikke super meget til delphi,
men umiddelbart hvis du fjerner : i værdierne..

så dit timeMin = 0800 (bliver jo så til 800)
og dit timeMax = 1600

så er det jo meget nemmere..

if myTime > timeMin and myTime < timeMax then...
23. september 2013 - 09:17 #4
HEJ,

Kroning: 

Jeg bruger primært TDateTime (TTime).

Hugo Petersen: 

Lød umiddelbart som det jeg søgte, men findes ikke på min D7 Enterprise (jo- jeg ved den er gammel..!). Men som et plaster på det sår, fandt jeg nogen andre brugbare rutine i DateUtils (som skal bruges andre  steder), så linket var særdeles brugbart.

therealyoda:

Ideen er frisk. Lyder umiddelbart spændende. Skal prøve den.


Melder tilbage.

Kristian
Avatar billede kroning Nybegynder
23. september 2013 - 09:53 #5
Hvis du bruger TDateTime kan du gøre som therealyoda skriver:

if (myTime>=timeMin) and (myTime<=timeMax) then
  ShowMessage('Ja indenfor tidsintervallet');
Avatar billede kroning Nybegynder
23. september 2013 - 09:53 #6
Og jeg mener _uden_ først at konvertere tiderne til f.eks. 0800 osv. da TDateTime jo bare er en double
Avatar billede hugopedersen Nybegynder
23. september 2013 - 18:28 #7
Sakset fra DateUtils fra XE3

function TimeInRange(ATime: TTime; AStartTime, AEndTime: TTime; AInclusive: Boolean = True): Boolean;
begin
  if AInclusive then
    Result := (TimeOf(AStartTime) <= TimeOf(ATime)) and (TimeOf(ATime) <= TimeOf(AEndTime))
  else
    Result := (TimeOf(AStartTime) < TimeOf(ATime)) and (TimeOf(ATime) < TimeOf(AEndTime));
end;


function TimeOf(const AValue: TDateTime): TDateTime;
begin
  Result := Frac(AValue);
end;
25. september 2013 - 10:57 #8
HEJ

Jeg har ikke glemt jer.

Den Første del af opgaven/projektet har vist sig at være lidt mere kompliceret end først antaget, (kunden har ønsket nogle ændringer!) -  så det kræver modifikation af den valgte løsning, ( læs: Delphi- rutiner) og (især) tid.

TimeInrange er en del af denne opgave/problem, men kommer på en senere del af problemløsningen. Så jeg koncenterer mig om 1. del først og kommer tilbage senere. Forventet i løbet af weekenden. 

Kristian
Avatar billede hugopedersen Nybegynder
26. september 2013 - 06:33 #9
Hvor ville verden se anderledes ud hvis der ikke var så mange kunder/brugere :-)

Jeg kan især huske et projekt jeg startede på i 1998 (lavet i MS Access/VBA), der bare lige skulle kunne registrere nogle testdata. Men i 2011 da jeg stoppede med at vedligeholde det kunne jeg overhovedet ikke genkende den oprindelige kravspec i systemet :-)
26. september 2013 - 09:46 #10
HEJ,

LOL, LOL , og atter LOL,

Tja, at skrive en kravspec. minder mig om følgende (meget søde historie //sandsynligvis en vandrehistorie..):

En kunde var efterhånden blevet så træt af transportselskabets (SAS, eller DSB (?)) evige forsinkelser, at han i meget sure vendinger påtalte selskabets køre-/flyve-plan overfor en af selskabets ansatte i et ikke alt for pænt ordvalg.

Hun, til gengæld, smilte sødt tilbage og svarede honningsødt:

"Hvis vi ikke havde køre-/flyve-planen, havde vi jo ikke noget at basere vore forsinkelser på... "

Og ditto med kravspecs....

KRISTIAN
01. oktober 2013 - 09:57 #11
PS:

og 10000 tak til Kroning for den med DOUBLE...

KR
Avatar billede hrc Mester
03. oktober 2013 - 10:37 #12
Det er alt sammen noget du selv kan undersøge hvis du graver ned i Delphis VCL. 90% af alt du bruger, ligger med sourccekode. Hvis du eksempelvis klikker på TDateTime mens du holder ctrl-knappen nede, så ender du direkte hvor TDateTime er defineret.

TDateTime er i øvrigt en elegant konstruktion. Heltalsdelen er antal dage siden Kong Volmer (31.12.1899), mens decimaldelen er antallet af millisekunder siden midnat.
Avatar billede MADOlsen Forsker
03. oktober 2013 - 10:48 #13
TDateTime er i øvrigt en elegant konstruktion. Heltalsdelen er antal dage siden Kong Volmer (31.12.1899), mens decimaldelen er antallet af millisekunder siden midnat.

Det er nu siden 30.12.1899 - og hvis du kender en fornuftig forklaring på, hvorfor det er fra præcis denne dato, så vil jeg meget gerne høre den! :-)
Avatar billede kroning Nybegynder
03. oktober 2013 - 11:15 #14
hrc > ", mens decimaldelen er antallet af millisekunder siden midnat."
Det er jo ikke helt rigtig, det har ikke noget at gøre med antal minutter, sekunder eller milli.

Hvis man vil finde antal millisekunder, sekunder eller minutter ud fra en TDateTime skal der regnes lidt på det, f.eks.

Antalmilli = frac(now)*(24*60*60*1000);
Avatar billede hrc Mester
03. oktober 2013 - 12:56 #15
kroning: Du har ret. 41550.5 er i dag kl. 12, mens 41550.25 var kl. 6 i morges osv. Tænkte nok på GetTickCount, som tæller fra maskinen blev bootet.

Lidt overraskende læser jeg, at man kan man gå længere bagud ved at bruge negative værdier. Dagen -1 er altså d. 29.12.1899

Mht. datoen 30.12.1899. Mener det er Steve Balmers fødelsdag (det er faktisk Lotus 123's skyld: http://social.msdn.microsoft.com/Forums/office/en-US/f1eef5fe-ef5e-4ab6-9d92-0998d3fa6e14/what-is-story-behind-december-30-1899-as-base-date)
Avatar billede mbsnet Nybegynder
08. oktober 2013 - 12:23 #16
Ja. (før komma) er datoen, (efter komma) er tiden:

dt  :TDateTime  = now;
dato :integer    = integer(dt);
tid  :double    = frac(dt);

function inRange(dt,a,b:INTEGER):boolean;overload;
begin
result:=(dt>=a) and (dt<=b)
end;

function inRange(dt,a,b:DOUBLE):boolean;overload;
begin
result:=(dt>=a) and (dt<=b)
end;

//..

//Brug integer hvis kun dato:
bl:=inRange(integer(dt),integer(now)-1,integer(now)+1);

//For både dato og tid brug float (double):
bl:=inRange(dt,now-1,now+1);
Avatar billede hrc Mester
08. oktober 2013 - 12:42 #17
Man behøver ikke konvertere noget til integer. Man bør bruge de indbyggede funktioner fra DateUtils. Her er det DateOf(<TDateTime>) eller TimeOf(<TDateTime>) der hhv. returnerer heltals- og decimaldelen på en TDateTime.

Ydermere er der nedenstående interval-funktioner:

function DateTimeInRange(ADateTime: TDateTime; AStartDateTime, AEndDateTime: TDateTime; aInclusive: Boolean = True): Boolean;
function DateInRange(ADate: TDate; AStartDate, AEndDate: TDate; AInclusive: Boolean = True): Boolean;
function TimeInRange(ATime: TTime; AStartTime, AEndTime: TTime; AInclusive: Boolean = True): Boolean;
Avatar billede mbsnet Nybegynder
08. oktober 2013 - 14:01 #18
Det var ikke det jeg sagde...
Hvis du kun vil arbejde med datoen så brug integer...
Det er rigtig nok at bruge dateutils eller andre dato libs..
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester



Seneste spørgsmål Seneste aktivitet
I går 23:37 Poe strøm Af lurup i LAN/WAN
I går 14:46 GIF-EDITOR Af snestrup2000 i Billedbehandling
I går 14:03 Logge ind Af Bob i PC
I går 12:12 2 skærme - 1 virker - den anden siger No signal Af eksmojo i Skærme
I går 10:33 openvpn projekt Af dcedata1977 i Windows