Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Rundungsfehler bei MinutesBetween und Secondsbetween (https://www.delphipraxis.net/185862-rundungsfehler-bei-minutesbetween-und-secondsbetween.html)

khh 13. Jul 2015 08:56

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

Der schöne Günther 13. Jul 2015 09:13

AW: Rundungsfehler bei MinutesBetween und Secondsbetween
 
Ich glaube dein Computer ist kaputt. Du musst ihn wegwerfen und dir einen neuen kaufen.

Delphi-Quellcode:
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;
erbibt auf meinem PC
Delphi-Quellcode:
36000

Union 13. Jul 2015 09:14

AW: Rundungsfehler bei MinutesBetween und Secondsbetween
 
Nein, FPC addiert einen Offset von
Delphi-Quellcode:
TDateTimeEpsilon = 2.2204460493e-16

RoadR69 13. Jul 2015 09:24

AW: Rundungsfehler bei MinutesBetween und Secondsbetween
 
Delphi XE7 liefert 600 bzw. 36000

Also: Lazarus? Welche Version? Welches Plattform?

khh 13. Jul 2015 09:46

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

BadenPower 13. Jul 2015 10:49

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;

khh 13. Jul 2015 11:51

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 :-(

khh 13. Jul 2015 12:01

AW: Rundungsfehler bei MinutesBetween und Secondsbetween
 
alsooo, egal wie ichs mache,

Delphi-Quellcode:

 larbeitsbeginn:= ZQuery.FieldByName('arbeitsbeginn').AsDateTime;
 larbeitsende:= ZQuery.FieldByName('arbeitsende').AsDateTime;
 lDateTime2 := RoundTo(larbeitsbeginn,-10);
 lDateTime3 := RoundTo(larbeitsende,-10);
 lsekunden := SecondsBetween(lDateTime2,lDateTime3) ;
bei 10 stunden ist der Fehler da.

khh 13. Jul 2015 12:09

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

BadenPower 13. Jul 2015 12:40

AW: Rundungsfehler bei MinutesBetween und Secondsbetween
 
Zitat:

Zitat von khh (Beitrag 1308552)
alsooo, egal wie ichs mache,

Delphi-Quellcode:
 larbeitsbeginn:= ZQuery.FieldByName('arbeitsbeginn').AsDateTime;
 larbeitsende:= ZQuery.FieldByName('arbeitsende').AsDateTime;
 lDateTime2 := RoundTo(larbeitsbeginn,-10);
 lDateTime3 := RoundTo(larbeitsende,-10);
 lsekunden := SecondsBetween(lDateTime2,lDateTime3) ;
bei 10 stunden ist der Fehler da.

Lass mal den Zwischenschritt weg:

Delphi-Quellcode:
 lDateTime2 := RoundTo(ZQuery.FieldByName('arbeitsbeginn').AsDateTime,-10);
 lDateTime3 := RoundTo(ZQuery.FieldByName('arbeitsende').AsDateTime,-10);
 lsekunden := SecondsBetween(lDateTime2,lDateTime3) ;
Oder Runde auf weniger Nachkommestellen als 10 z.B 8 oder 6.

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 19:04 Uhr.
Seite 1 von 2  1 2      

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