Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Millisekunden aus Time ausrechnen (https://www.delphipraxis.net/151540-millisekunden-aus-time-ausrechnen.html)

Muchacho 22. Mai 2010 00:25


Millisekunden aus Time ausrechnen
 
Hi,

wie kann ich mathematisch Millisekunden aus einer Uhrzeit ausrechnen, wenn ich die Funktion Time benutze?

Ich habe probiert mit DecodeTime
Delphi-Quellcode:
  Present := Time;
  DecodeTime(Present, Hour, Min, Sec, MSec);
  Sekunden:= (Hour * 3600) + (Min * 60) + Sec;
  Millisekunden := (Sekunden * 1000) + MSec;
Leider bekomme ich falsche Ergebnisse

Bitte um Hilfe

Gruß

Muchacho

rollstuhlfahrer 22. Mai 2010 00:33

Re: Millisekunden aus Time ausrechnen
 
in wie fern bekommst du falsche Ergebnisse? - Springen die illisekunden anstatt langsam hochzuzählen? - Das ist normal. Dafür ist Time einfach die falsche Methode. Ich würde dir dafür QueryPerformanceCounter() + QueryPerformanceFrequency() enmpfehlen. Damit kannman bis auf Millisekundenbasis runter. Wie genau der ist, zeigt die Frequenz (s^-1). Diese kann von Rechner zu Rechner unterschiedlich sein, liegt aber in den meisten Fällen über 1 Mio.

Bernhard

Edit: Ist dein "Millisekunden" auch Int64 oder Single, Double, Extended? Alleine 1 Stunde macht 3,6 Mio mSek. Das ist mehr, als in einen Integer rein geht. Ein Cardinal würde das gerade so verkraften. -> Projektoptionen und Bereichsprüfung aktivieren.

himitsu 22. Mai 2010 00:35

Re: Millisekunden aus Time ausrechnen
 
Zitat:

Zitat von Muchacho
Leider bekomme ich falsche Ergebnisse

Was erwartest du denn für Ergebnisse?

Oder anders gesagt: Ich versteh auch noch nicht, was du eigentlich erreichen willst.

PS: Der Wert von Time in Millisekunden umgerechnte sprengt die Grenzen eines Interges.

sx2008 22. Mai 2010 00:37

Re: Millisekunden aus Time ausrechnen
 
Ein Tag im TDateTime-System entspricht 1.0, also kann man das direkt in Millisekunden umrechnen.
Delphi-Quellcode:
Present := Time;
Millisekunden := Present*{Stunden pro Tag}24 * {Min pro std}60 * {s pro Min}60 * 1000;
Es gibt sogar irgendwo in Unit System oder SysUtils eine Konstante MILLISECONDS_PER_DAY (oder so ähnlich, kann gerade nicht nachschauen)
Delphi-Quellcode:
Millisekunden := Trunc(Time*MILLISECONDS_PER_DAY);

alzaimar 22. Mai 2010 07:57

Re: Millisekunden aus Time ausrechnen
 
Zitat:

Zitat von rollstuhlfahrer
Edit: Ist dein "Millisekunden" auch Int64 oder Single, Double, Extended? Alleine 1 Stunde macht 3,6 Mio mSek. Das ist mehr, als in einen Integer rein geht. Ein Cardinal würde das gerade so verkraften. -> Projektoptionen und Bereichsprüfung aktivieren.

Da musst Du Milli mit Mikro verwechselt und dich zudem verrechnet haben: Da der Tag 86.400 Sekunden hat, wären das 86.4 Mio Millisekunden oder aber 86.4 Mrd Mikrosekunden

himitsu 22. Mai 2010 08:10

Re: Millisekunden aus Time ausrechnen
 
Neee, ich hab mich zuerst verschätzt. :mrgreen:
Ich hatte bei Time mit den gesamten Inhalt von Now gerechnet.
(TTime ist 'ne Ableitung von TDateTime und im TDateTimePicker haben Time, Date und DateTime alle genau den selben Wert, weil da irgendwer die Trunc und Frac vergessen hat zu verbauen)

Now = aktuell 40320,3775902315 *24*60*60*1000 = 3.483.680.623.796,0016 [0000032B 1B8BCCB3]

hast also Recht: 0 <= Time < 1 entspricht 0 bis 86.399.999 [05265BFF]

Also im Grunde sollte seine ursprüngliche Berechnung (siehe Post #1) korrekte Werte liefern:
Delphi-Quellcode:
var
  Hour, Min, Sec, MSec: Word;
  Millisekunden: Cardinal;
begin
  DecodeTime(Time, Hour, Min, Sec, MSec);
  Millisekunden := Hour * 3600000 + Min * 60000 + Sec * 1000 + MSec;
  Edit1.Text := FloatToStr(Millisekunden);
end;

OK, von der Logik her müßte man zwar erst die Word-Werte erweitern, weil dort wirklich nicht das Ergebnis reinpaßt, aber zum Glück erweitert Delphi dieses schon automatisch auf Integer/Cardinal, um einfacher über die Register damit rechnen zu können.
(bei Int64-Zwischenergebnissen müßte diese aber manuell erweitern, über Type-Casts)

Und Millisekunden darf natürlich nicht als Word deklariert sein, sonst wird das Ergebnis ja gekürzt.
(die Deklaration wurde uns aber mal wieder unterschladen)

Matze 22. Mai 2010 08:21

Re: Millisekunden aus Time ausrechnen
 
Zitat:

Zitat von alzaimar
Zitat:

Zitat von rollstuhlfahrer
Edit: Ist dein "Millisekunden" auch Int64 oder Single, Double, Extended? Alleine 1 Stunde macht 3,6 Mio mSek. Das ist mehr, als in einen Integer rein geht. Ein Cardinal würde das gerade so verkraften. -> Projektoptionen und Bereichsprüfung aktivieren.

Da musst Du Milli mit Mikro verwechselt und dich zudem verrechnet haben: Da der Tag 86.400 Sekunden hat, wären das 86.4 Mio Millisekunden oder aber 86.4 Mrd Mikrosekunden

1 Stunde = 3.600 Sekunden = 3.600 * 1.000 Millisekunden = 3,6 Mio. Millisekunden. Das passt schon.

Aber in einen signed 32-bit-Integer kriegt man das locker rein, der reicht ja von -2^31 bis 2^31 - 1 (−2.147.483.648 bis 2.147.483.647).

himitsu 22. Mai 2010 08:25

Re: Millisekunden aus Time ausrechnen
 
@Matze: Moin und "1 Stunde = " ... ein Tag hat doch aber ein paar mehr davon?

Muchacho 22. Mai 2010 16:44

Re: Millisekunden aus Time ausrechnen
 
Danke für Eure Hilfe :-D

Mein Datentyp war falsch (integer :oops: )

Jetzt ist alles in Ordnung

Gruß

Muchacho


Alle Zeitangaben in WEZ +1. Es ist jetzt 03:15 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz