23. september 2013 - 00:24Der 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.)
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.
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;
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.
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 :-)
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å... "
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.
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! :-)
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.
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.
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..
Synes godt om
Ny brugerNybegynder
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.