![]() |
Erledigt - DateUtils.RecodeTime und 0 Sekunden
Ich verwende aktuell RecodeTime, um die Uhrzeit einer DateTime-Variable anzupassen.
Bei der Übergabe von 86399 (23:59:59) geht komischerweise eine Sekunde verloren und daraus wird 25:59:58. Woran kann das liegen?
Delphi-Quellcode:
Ok das 58 zu 59-Problem ist gelöst. Round statt Trunc in meiner eigenen Funktion war die Lösung.
function SecondsToDateTime(wSeconds: Int64): TDateTime;
var aHours, aMinutes, aSeconds, aDivisor: Int64; begin aDivisor := 60; aSeconds := wSeconds mod aDivisor; aMinutes := (wSeconds div aDivisor) mod aDivisor; aHours := (wSeconds div aDivisor) div aDivisor; aHours := aHours mod 24; Result := EncodeTime(aHours, aMinutes, aSeconds, 000); end; function UnixToDateTime(Timestamp: Integer): TDateTime; begin Result := (Timestamp / 86400) + 25569; end; unction DateTimeToUnix(DateTime: TDateTime): Integer; begin Result := Trunc((DateTime - 25569) * 86400); // Lösung gefunden: hier round statt trunc end; function ChangeTime(DateTime: TDateTime; const NewTime: Integer): Integer; var aNewTime: TDateTime; begin if (NewTime >= 86400) or (NewTime <= 0) then // Sicherheitshalber denn sonst gäbe es gar keine Zeitangabe! aNewTime := StrToTime('00:00:00') else aNewTime := SecondsToDateTime(NewTime); // bis hier hin ist es noch 23:59:59 DateTime := RecodeTime(DateTime, System.DateUtils.HourOf(aNewTime), System.DateUtils.MinuteOf(aNewTime), System.DateUtils.SecondOf(aNewTime), 000); Result := DateTimeToUnix(DateTime); ShowMessage(DateTimeToStr(UnixToDateTime(Result)) + sLineBreak + NewTime.ToString); // Resultat 23:59:58 end; Aber ein letztes Problem besteht noch. Wie stellt man mit DateTimeToStr() ein Datum mit einer Uhrzeit von 00:00:00 dar? Gerade entdeckt, dass DateTimeToStr() keine Zeit darstellt, wenn es 00:00:00 ist. Erledigt! |
AW: Erledigt - DateUtils.RecodeTime und 0 Sekunden
Bei mir stimmt es und ist am Ende immernoch :59 .
Wurde in deinem Programm am Round-Mode rumgepfuscht? TDateTime (Double) ist noch ein paar Jährchen genau genug, um auf mindestens 1 Millisekunde genau zu sein. Also Rundungsfehler aufgrund der Datengröße kann es nicht sein. Bleibt also nur noch ein anderer Rundungsmodus oder eine kaputte FPU. :stupid: PS: Ab dem 19. Januar 2038 um 03:14:08 wird deine Funktion wieder kaputt sein, wenn der Integer zu klein für den Unix-Timestamp ist. :angle: [edit] Ahh, also doch ein Rundungsproblemchen, nur wo anders. :lol: und ![]() |
AW: Erledigt - DateUtils.RecodeTime und 0 Sekunden
Zitat:
Genau. Trunc durch Round tauschen und alles ist gut. Zitat:
Ansonsten baue ich alles nach ISO 8601 YYYYMMDDHHMMSS) um. ( Ich habe hierzu ein neues Thema eröffnet: ![]() Zitat:
Habe das jetzt anders gfelößt. Aber wie kommt man auf die beknackte Idee 00:00:00 nicht darstellen zu müssen? |
AW: Erledigt - DateUtils.RecodeTime und 0 Sekunden
Zitat:
Delphi-Quellcode:
mitgibst. Versuch mal
'c'
Delphi-Quellcode:
als Format-String.
'ddddd t'
|
AW: Erledigt - DateUtils.RecodeTime und 0 Sekunden
Klar geht das mit FormatDateTime, gerade unter Tokyo.1 getestet.
Delphi-Quellcode:
Das liefert im Label dann "30.08.2017 00:00:00"
procedure TForm10.Button1Click(Sender: TObject);
var mytime: TDateTime; begin mytime := Trunc(Now); Label1.Caption := FormatDateTime('ddddd tt', mytime, TFormatSettings.Create); end; Ansonsten ist das Verhalten von DateTimeToString "as designed". Sherlock |
AW: Erledigt - DateUtils.RecodeTime und 0 Sekunden
Zitat:
Ciao Stefan |
Alle Zeitangaben in WEZ +1. Es ist jetzt 12:23 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