![]() |
Rundungsfehler bei MinutesBetween und Secondsbetween
Hallo zusammen, kann jemand von euch nachvollziehen, warum bei obigen Funktionen zwischen:
24.07.2015 03:00:00 und 24.07.2015 13:00:00 35999 sekunden bzw. 599 Minuten zurückgegeben werden ? Ich danke euch |
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
Ich glaube dein Computer ist kaputt. Du musst ihn wegwerfen und dir einen neuen kaufen.
Delphi-Quellcode:
erbibt auf meinem PC
procedure justSecondThings();
var date1, date2: TDateTime; secondsBetween: Int64; begin date1 := EncodeDateTime(2015, 07, 24, 03, 0, 0, 0); date2 := EncodeDateTime(2015, 07, 24, 13, 0, 0, 0); secondsBetween := System.DateUtils.SecondsBetween(date1, date2); WriteLn(secondsBetween); end;
Delphi-Quellcode:
36000
|
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
Nein, FPC addiert einen Offset von
Delphi-Quellcode:
TDateTimeEpsilon = 2.2204460493e-16
|
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
Delphi XE7 liefert 600 bzw. 36000
Also: Lazarus? Welche Version? Welches Plattform? |
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
windows 7 prof
lazarus 1.4RC2 FPC 264 REV 48058 PS: bei 11 oder 9 std. stimmen die Werte |
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
Das gleiche "Fehlverhalten" zeigt sich auch unter Delphi2007.
Das resultiert aus Rundungs-Differenzen beim Umwandeln von z.B Stings in Datumswerte. Wenn Du den Float-Wert für das Datum direkt angibst, dann stimmt das Ergebnis auch. Oder Du rundest den Datumswert nach der Umwndlung aus einem String auf die 10. Nachkommastelle.
Delphi-Quellcode:
unit Unit1;
{$mode objfpc}{$H+} interface uses Classes, SysUtils, FileUtil, Forms, Controls, Graphics, Dialogs, StdCtrls; type { TForm1 } TForm1 = class(TForm) Button1: TButton; Button2: TButton; procedure Button1Click(Sender: TObject); procedure Button2Click(Sender: TObject); private { private declarations } public { public declarations } end; var Form1: TForm1; implementation uses DateUtils,Math; {$R *.lfm} { TForm1 } procedure TForm1.Button1Click(Sender: TObject); var lDateTime1: TDateTime; lDateTime2: TDateTime; begin lDateTime1 := 42209.125; lDateTime2 := 42209.54166666667; //ShowMessage(DateTimeToStr(lDateTime2)); ShowMessage(IntToStr(MinutesBetween(lDateTime1,lDateTime2))); end; procedure TForm1.Button2Click(Sender: TObject); var lDateTime1: TDateTime; lDateTime2: TDateTime; begin //lDateTime1 := EncodeDateTime(2015, 07, 24, 03, 0, 0, 0); //lDateTime2 := EncodeDateTime(2015, 07, 24, 13, 0, 0, 0); lDateTime1 := StrToDateTime('24.07.2015 03:00:00'); //lDateTime2 := StrToDateTime('24.07.2015 13:00:00'); lDateTime2 := RoundTo(StrToDateTime('24.07.2015 13:00:00'),-10); ShowMessage(FloatToStr(lDateTime1)); ShowMessage(FloatToStr(lDateTime2)); ShowMessage(IntToStr(MinutesBetween(lDateTime1,lDateTime2))); end; |
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
funktioniert leider trotzdem nicht.
Wenn ich den Wert asDateTime (aus der Datenbank im Timestamp-Feld) übergebe, bekomme ich genau auch diese Differenz bei 10 Stunden. 11 und 9 stimmen :-( Moment, ich sehe gerade du rundest VOR Minutesbetween :-( macht trotzdem nix aus :-( |
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
alsooo, egal wie ichs mache,
Delphi-Quellcode:
bei 10 stunden ist der Fehler da.larbeitsbeginn:= ZQuery.FieldByName('arbeitsbeginn').AsDateTime; larbeitsende:= ZQuery.FieldByName('arbeitsende').AsDateTime; lDateTime2 := RoundTo(larbeitsbeginn,-10); lDateTime3 := RoundTo(larbeitsende,-10); lsekunden := SecondsBetween(lDateTime2,lDateTime3) ; |
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
ich löse das nun anders.
ich ziehe Arbeitsbeginn von Arbeitsende ab und nehme den Wert mit DecodeTime ausseinander, das klappt. Dann muss ich halt eventuell anfallende Tage wieder zu den Stunden dazu zählen, aber was solls. Ich danke euch |
AW: Rundungsfehler bei MinutesBetween und Secondsbetween
Zitat:
Delphi-Quellcode:
Oder Runde auf weniger Nachkommestellen als 10 z.B 8 oder 6.
lDateTime2 := RoundTo(ZQuery.FieldByName('arbeitsbeginn').AsDateTime,-10);
lDateTime3 := RoundTo(ZQuery.FieldByName('arbeitsende').AsDateTime,-10); lsekunden := SecondsBetween(lDateTime2,lDateTime3) ; Bei mir unter Lazarus 1.4 funktioniert das Runden auf 10 Nachkommastellen um auch mit SecondsBetween den Wert 36000 zu erhalten. Hast Du Dir schon einmal anzeigen lassen, was larbeitsbeginn und larbeitsende für Werte haben, nachdem Du diese aus den Feldwerten zuweist? |
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:33 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz