AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Bis = 24:00:00

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

Registriert seit: 20. Jan 2006
Ort: Lübbecke
11.629 Beiträge
 
Delphi 12 Athens
 
#1

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 10:04
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;
Uwe Raabe
Certified Delphi Master Developer
Embarcadero MVP
Blog: The Art of Delphi Programming
  Mit Zitat antworten Zitat
Incocnito

Registriert seit: 28. Nov 2016
229 Beiträge
 
#2

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 16:14
@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
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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Bis = 24:00:00

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

Geändert von himitsu (12. Apr 2023 um 17:13 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

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
549 Beiträge
 
Delphi 11 Alexandria
 
#5

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
702 Beiträge
 
Delphi 10.3 Rio
 
#6

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.555 Beiträge
 
Delphi 7 Professional
 
#7

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.340 Beiträge
 
Delphi 12 Athens
 
#8

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.629 Beiträge
 
Delphi 12 Athens
 
#9

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


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 21:22 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