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:
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;
Ok das 58 zu 59-Problem ist gelöst. Round statt Trunc in meiner eigenen Funktion war die Lösung.
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!