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
Seite 1 von 2  1 2      
Incocnito

Registriert seit: 28. Nov 2016
223 Beiträge
 
#1

Bis = 24:00:00

  Alt 12. Apr 2023, 09:20
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
  Mit Zitat antworten Zitat
Benutzerbild von arcticwolf
arcticwolf

Registriert seit: 3. Aug 2021
Ort: Erfurt
41 Beiträge
 
Delphi 11 Alexandria
 
#2

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 10:35
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
Wolfgang
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#3

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 10:38
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?
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.625 Beiträge
 
Delphi 12 Athens
 
#4

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 10:53
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
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Delphi.Narium

Registriert seit: 27. Nov 2017
2.508 Beiträge
 
Delphi 7 Professional
 
#5

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 10:58
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;
  Mit Zitat antworten Zitat
Benutzerbild von Uwe Raabe
Uwe Raabe

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

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 11: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
223 Beiträge
 
#7

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 17: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.184 Beiträge
 
Delphi 12 Athens
 
#8

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 17: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.
$2B or not $2B

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

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

AW: Bis = 24:00:00

  Alt 12. Apr 2023, 19: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
$2B or not $2B

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

Registriert seit: 26. Mai 2004
Ort: Rheine
549 Beiträge
 
Delphi 11 Alexandria
 
#10

AW: Bis = 24:00:00

  Alt 13. Apr 2023, 11: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
Antwort Antwort
Seite 1 von 2  1 2      


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