![]() |
Bis = 24:00:00
Moin Zusammen!
Gibt da wohl bei Zeitangaben auch "24:00:00". vgl. ![]() Klar, "23:59:59" könnte dazu führen, dass "23:59:59.999" nicht mit enthalten ist und "00:00:00" (des Folgetages) könnte dazu führen, dass man in dieser einen Sekunde noch was machen kann in der man das nicht machen können dürfte, aber cool finde ich das nicht. Gebraucht wird das wohl für Ende-Angaben. Ich würde dann aber einfach definieren, dass Ende-Angaben immer bis zum Ende der angegebenen Sekunde zählen. Ein Kollege hat das in einer XML-Datei so vorliegen. Delphi kann per se erstmal nicht damit umgehen scheint mir. Und ich habe nun "einfach" gesagt "if '24:00:00' then '23:59:59'". Hat da jemand Erfahrungen dazu? Was ist eure Meinung? Liebe Grüße Incocnito |
AW: Bis = 24:00:00
Hallo Incocnito,
wenn Du erreichen möchstest, dass eine Funktion nur "heute" ausgeführt werden kann, dann nimm doch einfach den TDateTime Wert von morgen 00:00 Uhr und mach eine kleiner als Abfrage. TDateTime = 45028,0 -> 12.04.2023, 00:00:00 TDateTime = 45028,5 -> 12.04.2023, 12:00:00 TDateTime = 45029,0 -> 13.04.2023, 00:00:00 If (Now < 45029,0) then ... Viele Grüße Wolfgang |
AW: Bis = 24:00:00
Zitat:
|
AW: Bis = 24:00:00
Mein Delphi kann damit umgehen.
Delphi-Quellcode:
Ergebnis:
uses DateUtils;
procedure TFormTest.FormCreate(Sender: TObject); var lDate: TDateTime; begin lDate := ISO8601ToDate('2023-04-12T24:00', false); ShowMessage(DateTimeToStr(lDate)); end; Zitat:
|
AW: Bis = 24:00:00
24:00:00 Uhr heute = 00:00:00 Uhr morgen
Delphi-Quellcode:
var
dtZuVerarbeitendeZeitangabe : TDateTime; dtHeute : TDateTime; dtMorgen : TDateTime; begin // Irgendwoher komme eine Zeitangabe: dtZuVerarbeitendeZeitangabe := '23:59:59.999'; // nur symbolische Zuweisung dtHeute := Trunc(dtZuVerarbeitendeZeitangabe); dtMorgen := dtHeute + 1; if dtZuVerarbeitendeZeitangabe < dtMorgen then begin // Hier sind wir auf jeden Fall noch vor 24:00:00, also Heute end; end; |
AW: Bis = 24:00:00
Zitat:
Delphi-Quellcode:
function IsValidTime(const AHour, AMinute, ASecond, AMilliSecond: Word): Boolean;
begin Result := ((AHour < HoursPerDay) and (AMinute < MinsPerHour) and (ASecond < SecsPerMin) and (AMilliSecond < MSecsPerSec)) or ((AHour = 24) and (AMinute = 0) and // midnight early next day (ASecond = 0) and (AMilliSecond = 0)); end; |
AW: Bis = 24:00:00
@DaddyH / @Uwe_Raabe:
Mein Kollege meinte das und ich habe ihm erstmal blind geglaubt, dass Delphi damit nicht umgehen kann. 😅 ... Ok, gerade mal geschaut: EncodeDateTime kann es wohl doch nicht. Läuft über TryEncodeDateTime und das über TryEncodeTime und das prüft "Hour < HoursPerDay". Ohne Außnahme für "24:00:00.000". @Delphi.Narium / @arcticwolf: Ja, das wäre auch mein Ansatz gewesen. Einfach zu sagen in den Felder (konkret scheinbar eine XML) soll folgendes stehen
Code:
dann gilt das bis-Feld immer bis zum Ende der Sekunde, also 2023-12-31 23:59:59.9999999999999999....
<von>2023-01-01 00:00:00</von>
<bis>2023-12-31 23:59:59</bis> Und eine Prüfung wäre dann, meiner Ansicht nach, mit "<" statt "<=" besser geeignet, also beispielsweise
Delphi-Quellcode:
Nur so als gaaanz grobes Beispiel. Eure Beispiele sind ja entsprechend.
if (Value < IncSecond(data.bis, 1)) then
@Der_schöne_Günther: Meiner Ansicht nach "gibt" es 31.12.2023 24:00:00 Uhr nicht. Das wäre der 01.01.2024 00:00:00 Uhr (Sehe das wie Delphi.Narium). Laut IONOS ist das aber wohl möglich und gemäß DaddyH und Uwe_Raabe geht das in Delphi (zumindest in den genannten Beispielen) doch wohl. Liebe Grüße und besten Dank schonmal für die Zeit Incocnito |
AW: Bis = 24:00:00
Muß auch, da die Amis krank sind.
Bei denen geht es von 12 bis 11 (nicht von 0 bis 11). ![]() Jetzt dürft ihr gern streiten, ob die 12 nicht eigentlich für 0 steht (wenn das AM/PM dran hängt) und es somit noch der selbe Tag ist (nicht der nächste ... aber nur zusammen mit AM/PM) Fazit: steht AM oder PM in der Zeitangabe: * dann wird aus einer 12 eine 0 * eine 0 bleibt 0 (falls wer falsch von 0 bis 11 zählt) * und bei PM wird dann nochmal 12 (für Nachmittag) dazugerechnet Die sollen sich nochmal über "Dreiviertel 5" aufregen. Unseres ist verständlicher einfacher, als deren Zeugs. ( bei unseren den Teilangaben wird einfach das Geschriebene als Stundenanteil, also mit 60 multiplitiert, nach dem
Delphi-Quellcode:
eingefügt und davor die Stundenzahl-1 )
:
In der deutschen Hilfe länger mal gedacht die rechnen ab "Mittag" .... und mich gewundert, dass sie in der SysUtils vermeintlich "falsch" rechnen :wall:, da sie in ![]() [add] müsste nicht -0.25 eigentlich 0.75-1, also ebenfalls 18:00 sein? maaaaaaaaahhhhhhhhhhhhhhhhhhh :freak: aber im ![]() (zum Glück kommen negative TDateTime-Werte selten vor) [neee] OK, Stunden sind immer der vorzeichenlose Nachkommaanteil. Muß man echt beim Rechnen aufpassen, beim Überschlag .... aber zum Glück rechnen IncMinutes und Co. richtig. |
AW: Bis = 24:00:00
Zitat:
Hab mal ganz böse rumgepfuscht, aber z.B. StrToDateTime mag es nicht.
Delphi-Quellcode:
uses DateUtils, StrUtils;
procedure TForm24.FormCreate(Sender: TObject); begin // FormatDateTime('dd.mm.yyyy hh:mm:ss', DE) = DateTimeToStr(T, DE) incl. 00:00:00 var EN := TFormatSettings.Create('en-US'); var DE := TFormatSettings.Create('de-DE'); var ShowString := procedure(S: string; FS: TFormatSettings) begin try var T := StrToDateTime(S, FS); Memo1.Lines.Add(Format('%s = %.4n = %s = %s', [S, T, FormatDateTime('dd.mm.yyyy hh:mm:ss', T, DE), DateTimeToStr(T, EN)])); except on E: Exception do Memo1.Lines.Add(Format('%s = %s' , [S, E.ClassName])); end; end; // {} = EConvertError Memo1.Lines.Add(''); {}ShowString('4/12/2023 00:00:00 AM', EN); {}ShowString('4/12/2023 00:01:00 AM', EN); ShowString('4/12/2023 01:00:00 AM', EN); ShowString('4/12/2023 02:00:00 AM', EN); ShowString('4/12/2023 11:00:00 AM', EN); ShowString('4/12/2023 12:00:00 AM', EN); ShowString('4/12/2023 12:01:00 AM', EN); {}ShowString('4/12/2023 00:00:00 PM', EN); {}ShowString('4/12/2023 00:01:00 PM', EN); ShowString('4/12/2023 01:00:00 PM', EN); ShowString('4/12/2023 02:00:00 PM', EN); ShowString('4/12/2023 11:00:00 PM', EN); ShowString('4/12/2023 12:00:00 PM', EN); ShowString('4/12/2023 12:01:00 PM', EN); Memo1.Lines.Add(''); ShowString('12.04.2023 00:00:00', DE); ShowString('12.04.2023 00:01:00', DE); ShowString('12.04.2023 01:00:00', DE); ShowString('12.04.2023 02:00:00', DE); ShowString('12.04.2023 11:00:00', DE); ShowString('12.04.2023 12:00:00', DE); ShowString('12.04.2023 12:01:00', DE); ShowString('12.04.2023 13:00:00', DE); ShowString('12.04.2023 14:00:00', DE); ShowString('12.04.2023 23:00:00', DE); {}ShowString('12.04.2023 24:00:00', DE); {}ShowString('12.04.2023 24:01:00', DE); var ShowDate := procedure(T: TDateTime) begin Memo1.Lines.Add(IfThen(T < 0, ' ', '+') + Format('%.4n = ', [T]) + FormatDateTime('dd.mm.yyyy hh:mm:ss', T, DE) + ' = ' + DateTimeToStr(T, EN)); end; Memo1.Lines.Add(''); ShowDate(45028.0); ShowDate(45028.5); ShowDate(45029.0); Memo1.Lines.Add(''); ShowDate(0); ShowDate(0 + 1/MinsPerDay); ShowDate(2.75); ShowDate(-1.25); ShowDate(35065); ShowDate(35065 + 1/MinsPerDay); Memo1.Lines.Add(''); ShowDate(1.75); ShowDate(IncDay(1.75, -2)); end;
Code:
4/12/2023 00:00:00 AM = EConvertError
4/12/2023 00:01:00 AM = EConvertError 4/12/2023 01:00:00 AM = 45.028,0417 = 12.04.2023 01:00:00 = 4/12/2023 1:00:00 AM 4/12/2023 02:00:00 AM = 45.028,0833 = 12.04.2023 02:00:00 = 4/12/2023 2:00:00 AM 4/12/2023 11:00:00 AM = 45.028,4583 = 12.04.2023 11:00:00 = 4/12/2023 11:00:00 AM 4/12/2023 12:00:00 AM = 45.028,0000 = 12.04.2023 00:00:00 = 4/12/2023 4/12/2023 12:01:00 AM = 45.028,0007 = 12.04.2023 00:01:00 = 4/12/2023 12:01:00 AM 4/12/2023 00:00:00 PM = EConvertError 4/12/2023 00:01:00 PM = EConvertError 4/12/2023 01:00:00 PM = 45.028,5417 = 12.04.2023 13:00:00 = 4/12/2023 1:00:00 PM 4/12/2023 02:00:00 PM = 45.028,5833 = 12.04.2023 14:00:00 = 4/12/2023 2:00:00 PM 4/12/2023 11:00:00 PM = 45.028,9583 = 12.04.2023 23:00:00 = 4/12/2023 11:00:00 PM 4/12/2023 12:00:00 PM = 45.028,5000 = 12.04.2023 12:00:00 = 4/12/2023 12:00:00 PM 4/12/2023 12:01:00 PM = 45.028,5007 = 12.04.2023 12:01:00 = 4/12/2023 12:01:00 PM 12.04.2023 00:00:00 = 45.028,0000 = 12.04.2023 00:00:00 = 4/12/2023 12.04.2023 00:01:00 = 45.028,0007 = 12.04.2023 00:01:00 = 4/12/2023 12:01:00 AM 12.04.2023 01:00:00 = 45.028,0417 = 12.04.2023 01:00:00 = 4/12/2023 1:00:00 AM 12.04.2023 02:00:00 = 45.028,0833 = 12.04.2023 02:00:00 = 4/12/2023 2:00:00 AM 12.04.2023 11:00:00 = 45.028,4583 = 12.04.2023 11:00:00 = 4/12/2023 11:00:00 AM 12.04.2023 12:00:00 = 45.028,5000 = 12.04.2023 12:00:00 = 4/12/2023 12:00:00 PM 12.04.2023 12:01:00 = 45.028,5007 = 12.04.2023 12:01:00 = 4/12/2023 12:01:00 PM 12.04.2023 13:00:00 = 45.028,5417 = 12.04.2023 13:00:00 = 4/12/2023 1:00:00 PM 12.04.2023 14:00:00 = 45.028,5833 = 12.04.2023 14:00:00 = 4/12/2023 2:00:00 PM 12.04.2023 23:00:00 = 45.028,9583 = 12.04.2023 23:00:00 = 4/12/2023 11:00:00 PM 12.04.2023 24:00:00 = EConvertError 12.04.2023 24:01:00 = EConvertError +45.028,0000 = 12.04.2023 00:00:00 = 4/12/2023 +45.028,5000 = 12.04.2023 12:00:00 = 4/12/2023 12:00:00 PM +45.029,0000 = 13.04.2023 00:00:00 = 4/13/2023 +0,0000 = 30.12.1899 00:00:00 = 12/30/1899 +0,0007 = 30.12.1899 00:01:00 = 12/30/1899 12:01:00 AM +2,7500 = 01.01.1900 18:00:00 = 1/1/1900 6:00:00 PM -1,2500 = 29.12.1899 06:00:00 = 12/29/1899 6:00:00 AM +35.065,0000 = 01.01.1996 00:00:00 = 1/1/1996 +35.065,0007 = 01.01.1996 00:01:00 = 1/1/1996 12:01:00 AM +1,7500 = 31.12.1899 18:00:00 = 12/31/1899 6:00:00 PM -1,7500 = 29.12.1899 18:00:00 = 12/29/1899 6:00:00 PM |
AW: Bis = 24:00:00
Hi zusammen,
ja: eigentlich existiert 24 Uhr nicht, wird allerdings umgangssprachlich häufig verwendet. Speziell in der ISO8601 ist 24:00:00 allerdings tatsächlich als Endzeitpunkt vorgesehen. Wie auch schon hier erwähnt, ist der Zeitpunk komplett gleichzusetzen mit 00:00 Uhr des Folgetages. Da die Implementierung der ISO8601 und Delphi ja offensichtlich funktioniert (oder ich habe hier etwas überlesen) und Delphi mit den normalen StrToDate, EncodeDate, etc.. vor den Hammer läuft ist das meines Erachtens absolut korrekt, wie Delphi das handhabt. (auch wenn es smarter wäre, wenn das in allen Varianten funktioniert :stupid:) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 04:54 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