Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   XML (https://www.delphipraxis.net/46-xml/)
-   -   Bis = 24:00:00 (https://www.delphipraxis.net/212842-bis-%3D-24-00-00-a.html)

Incocnito 12. Apr 2023 08:20

Bis = 24:00:00
 
Moin Zusammen!

Gibt da wohl bei Zeitangaben auch "24:00:00".
vgl. https://www.ionos.de/digitalguide/we...lung/iso-8601/

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

arcticwolf 12. Apr 2023 09:35

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

Der schöne Günther 12. Apr 2023 09:38

AW: Bis = 24:00:00
 
Zitat:

Zitat von Incocnito (Beitrag 1520889)
Hat da jemand Erfahrungen dazu? Was ist eure Meinung?

Ich schreibe Zeiten ehrlich so auf wie sie sind. Ich habe dein Problem noch nicht verstanden. Hast du ein konkretes Problem mit Zeitangaben wie "24:00:00" oder "23:59:59.123" oder "24:00:00.666" oder glaubst du nur, du könntest welche bekommen?

DeddyH 12. Apr 2023 09:53

AW: Bis = 24:00:00
 
Mein Delphi kann damit umgehen.
Delphi-Quellcode:
uses DateUtils;

procedure TFormTest.FormCreate(Sender: TObject);
var
  lDate: TDateTime;
begin
  lDate := ISO8601ToDate('2023-04-12T24:00', false);
  ShowMessage(DateTimeToStr(lDate));
end;
Ergebnis:
Zitat:

13.04.2023 02:00:00

Delphi.Narium 12. Apr 2023 09:58

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;

Uwe Raabe 12. Apr 2023 10:04

AW: Bis = 24:00:00
 
Zitat:

Zitat von Incocnito (Beitrag 1520889)
Delphi kann per se erstmal nicht damit umgehen scheint mir.

Also IsValidTime scheint damit kein Problem zu haben:
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;

Incocnito 12. Apr 2023 16:14

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:
<von>2023-01-01 00:00:00</von>
<bis>2023-12-31 23:59:59</bis>
dann gilt das bis-Feld immer bis zum Ende der Sekunde, also 2023-12-31 23:59:59.9999999999999999....
Und eine Prüfung wäre dann, meiner Ansicht nach, mit "<" statt "<=" besser geeignet,
also beispielsweise
Delphi-Quellcode:
if (Value < IncSecond(data.bis, 1)) then
Nur so als gaaanz grobes Beispiel. Eure Beispiele sind ja entsprechend.

@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

himitsu 12. Apr 2023 16:25

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).
https://studyflix.de/englisch/am-pm-6114 <- in der Tabelle besser zu erkennen


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 https://docwiki.embarcadero.com/Libr...stem.TDateTime einfach nur das AM wegließen, aber nicht 0:00 aus den beiden 12:00 AM gemacht haben .... die meinen eigentlich Mitternacht, aber es steht immernoch 12 Uhr "Mittag" dort.




[add]
müsste nicht -0.25 eigentlich 0.75-1, also ebenfalls 18:00 sein? maaaaaaaaahhhhhhhhhhhhhhhhhhh :freak:
aber im Englischen steht auch 6:00 AM (nicht 6:00 PM)
(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.

himitsu 12. Apr 2023 18:09

AW: Bis = 24:00:00
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1520896)
Also IsValidTime scheint damit kein Problem zu haben

IsValidTime und ISO8601ToDate sind scheinbar die Einzigen?


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

angos 13. Apr 2023 10:57

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 15:24 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