AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein Erledigt - DateUtils.RecodeTime und 0 Sekunden
Thema durchsuchen
Ansicht
Themen-Optionen

Erledigt - DateUtils.RecodeTime und 0 Sekunden

Ein Thema von Glados · begonnen am 29. Aug 2017 · letzter Beitrag vom 30. Aug 2017
 
Glados
(Gast)

n/a Beiträge
 
#1

Erledigt - DateUtils.RecodeTime und 0 Sekunden

  Alt 29. Aug 2017, 21:23
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!

Geändert von Glados (29. Aug 2017 um 22:37 Uhr)
  Mit Zitat antworten Zitat
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:44 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