AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Bis = 24:00:00

Ein Thema von Incocnito · begonnen am 12. Apr 2023 · letzter Beitrag vom 14. Apr 2023
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.826 Beiträge
 
Delphi 12 Athens
 
#1

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 18:09
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
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (12. Apr 2023 um 18:18 Uhr)
  Mit Zitat antworten Zitat
angos

Registriert seit: 26. Mai 2004
Ort: Rheine
553 Beiträge
 
Delphi 12 Athens
 
#2

AW: Bis = 24:00:00

  Alt 13. Apr 2023, 10:57
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 )
Ansgar
  Mit Zitat antworten Zitat
Benutzerbild von Sinspin
Sinspin

Registriert seit: 15. Sep 2008
Ort: Dubai
754 Beiträge
 
Delphi 10.3 Rio
 
#3

AW: Bis = 24:00:00

  Alt 14. Apr 2023, 09:47
Ich bin im englischen Raum unterwegs.(a.m. /p.m.)
Datumsformate und Zeiten in allen Variationen bereiten mir immer wieder viel Freude.
Bei Zeitangaben stand ich schon einige male mit einem Kopf voller Fragezeichen da.
a.m. : 12:00:00 bis 11:59:59
p.m. : 12:00:00 bis 11:59:59
Erstmal recht unscheinbar, aber es springt niemals auf null Uhr!
Bis zur ersten Stunde geht es von 12:00:01 bis 12:59:59.
Das ist für null terminierte Deutsche immer wieder verwirrend

Ich dachten im deutschen geht es von 00:00:00 bis 23:59:59.
24:00:00 halte ich als deutsches Wesen für ungültig.
Stefan
Nur die Besten sterben jung
A constant is a constant until it change.
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.610 Beiträge
 
Delphi 7 Professional
 
#4

AW: Bis = 24:00:00

  Alt 14. Apr 2023, 10:44
24:00:00 halte ich als deutsches Wesen für ungültig.
Nein, ist es nicht, z. B. bei Zeitangaben in der Form
Code:
Offfnungszeiten:

Mo.     12:00-18:00 Uhr
Di.-Do. 10:00-22:00 Uhr
Fr.+Sa. 08:00-02:00 Uhr
So.     16:00-24:00 Uhr
In einem derartigen Zusammenhang sind Angaben von 24:00 Uhr (und sogar darüber hinaus korrekt).

24:00 Uhr heißt hier halt, dass bis zum Tagesende geöffnet ist, auch wenn (strenggenommen) erst zur 0. Sekunde des Folgetages geschlossen wird.

Bei der Zeitangabe für Fr.+Sa. heißt die 02:00 Uhr, dass bis zum Folgetag, morgens um zwei Uhr geöffnet ist und nicht, dass die Öffnungszeit bereits am gleichen Tag um 14:00 Uhr endet.

24:00 Uhr heißt im Zusammenhang mit derartigen Zeitangaben, dass sie bis zum Tagesende gilt, darüber hinausgehende Zeitangaben, dass die Öffnungszeit bis in die frühen Morgenstunden des Folgetages gilt.

Wenn wir derartige Zeitangaben für ungültig erklären, müsste der Zeitplan in etwa so aussehen:
Code:
Offfnungszeiten:

Mo.     12:00-18:00 Uhr
Di.-Do. 10:00-22:00 Uhr
Fr.     08:00-Sa. 02:00 Uhr
Sa.     08:00-So. 02:00 Uhr
So.     16:00-Mo. 00:00 Uhr
Macht man eher nicht, die erste Variante ist aber (technisch gesehen) deutlich schwerer auszuwerten

Geändert von Delphi.Narium (14. Apr 2023 um 11:02 Uhr) Grund: Schreibfehler
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.826 Beiträge
 
Delphi 12 Athens
 
#5

AW: Bis = 24:00:00

  Alt 14. Apr 2023, 10:58
Darum ist bei einigen Funktionen auch genau 24:00 noch erlaubt, als Angabe für das Tagesende. (nur halt noch nicht bei Allen)
24:00:01 aber nicht, was auch OK ist.
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.877 Beiträge
 
Delphi 13 Florence
 
#6

AW: Bis = 24:00:00

  Alt 14. Apr 2023, 12:06
Ich würde vorschlagen, du lokalisiert die Methoden, bei denen es nicht funktioniert es aber funktionieren sollte, und schreibst einen Feature-Request.
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Antwort Antwort

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

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 13:20 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