![]() |
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:) |
AW: Bis = 24:00:00
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 :roll: 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. |
AW: Bis = 24:00:00
Zitat:
Code:
In einem derartigen Zusammenhang sind Angaben von 24:00 Uhr (und sogar darüber hinaus korrekt).
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 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:
Macht man eher nicht, die erste Variante ist aber (technisch gesehen) deutlich schwerer auszuwerten ;-)
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 |
AW: Bis = 24:00:00
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. |
AW: Bis = 24:00:00
Ich würde vorschlagen, du lokalisiert die Methoden, bei denen es nicht funktioniert es aber funktionieren sollte, und schreibst einen Feature-Request.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:29 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