Datumsformat
-
Jensen.. -
1. September 2025 um 22:18 -
Unerledigt
-
-
Hi Jensen.. ,
schau' dir mal die Hilfe zu _DateTimeFormat an. Dein $sZeit Format ist falsch.
Input date in the format "YYYY/MM/DD[ HH:MM:SS]" Korrigierter Code:
AutoIt#include <Date.au3> Local $sZeit = "2025/09/01[ 20:30:00]" ; In 24h-Format umwandeln Local $sNeuZeit = _DateTimeFormat($sZeit, 4) MsgBox(0, "Ergebnis", $sNeuZeit) ;Ausgabe soll sein: 20:30Viele Grüße
Sven -
Falls du Jensen.. wirklich vom 12 Std. Eingangsformat "HH:MM am|pm" (08:30 pm) zum 24 Stunden Format "HH:MM" (20:30) wechseln willst und nur die PM/AM Angabe hast, dann hilft dir die folgende Funktion:
AutoIt
Alles anzeigenFunc _Time12hTo24h($sTime) Local Const $iLeadingTrailingFlag = 1 + 2 $sTime = StringStripWS($sTime, $iLeadingTrailingFlag) $sTime = StringLower($sTime) Local Const $bIsPM = (StringInStr($sTime, 'pm') > 0) Local Const $bIsAM = (StringInStr($sTime, 'am') > 0) Local Const $sValidCharsPattern = '^[0-9]{1,2}:[0-9]{1,2}(?:\s?(?:am|pm))?$' If Not StringRegExp($sTime, $sValidCharsPattern) Then Return SetError(1, 0, -1) EndIf $sTime = StringRegExpReplace($sTime, '[^0-9:]', '') Local $aTime = StringSplit($sTime, ':') Local $iHour = Number($aTime[1]) Local $iMinute = Number($aTime[2]) Local $iSec = 0 If $aTime[0] >= 3 Then $iSec = Number($aTime[3]) EndIf Local $bIsValid = True Select Case $iHour < 0 Or $iHour > 12 $bIsValid = False Case $iMinute < 0 Or $iMinute > 59 $bIsValid = False Case $iSec < 0 Or $iSec > 59 $bIsValid = False EndSelect If Not $bIsValid Then Return SetError(1, 0, -2) EndIf If $bIsPM And $iHour < 12 Then $iHour += 12 EndIf If $bIsAM And $iHour = 12 Then $iHour = 0 EndIf Local $sHour = StringRight('0' & $iHour, 2) Local $sMinute = StringRight('0' & $iMinute, 2) Return $sHour & ':' & $sMinute EndFuncOkay:
AutoIt
Alles anzeigenConsoleWrite(_Time12hTo24h('1:20 AM') & @CRLF) ; 01:20 ConsoleWrite(_Time12hTo24h('1:20 PM') & @CRLF) ; 13:20 ConsoleWrite(_Time12hTo24h('08:30 PM') & @CRLF) ; 20:30 ConsoleWrite(_Time12hTo24h('12:00 AM') & @CRLF) ; 00:00 ConsoleWrite(_Time12hTo24h('12:01 AM') & @CRLF) ; 00:01 ConsoleWrite(_Time12hTo24h('12:00 PM') & @CRLF) ; 12:00 ConsoleWrite(_Time12hTo24h('12:01 PM') & @CRLF) ; 12:01 ConsoleWrite(_Time12hTo24h('7:5 pm') & @CRLF) ; 19:05 ConsoleWrite(_Time12hTo24h('7:5pm') & @CRLF) ; 19:05 ConsoleWrite(_Time12hTo24h('7:5 am') & @CRLF) ; 07:05 ConsoleWrite(_Time12hTo24h('7:5') & @CRLF) ; 07:05 ConsoleWrite(_Time12hTo24h('08:30') & @CRLF) ; 08:30Fehlerbehandlung:
AutoItConsoleWrite(_Time12hTo24h('25:30') & @CRLF) ; -2 ConsoleWrite(_Time12hTo24h('14:61') & @CRLF) ; -2 ConsoleWrite(_Time12hTo24h('0830') & @CRLF) ; -1 ConsoleWrite(_Time12hTo24h('08 : 30') & @CRLF) ; -1 ConsoleWrite(_Time12hTo24h('08: 30') & @CRLF) ; -1 ConsoleWrite(_Time12hTo24h('8: 30') & @CRLF) ; -1 ConsoleWrite(_Time12hTo24h('-1:-1') & @CRLF) ; -1 ConsoleWrite(_Time12hTo24h('*12:*05') & @CRLF) ; -1 ConsoleWrite(_Time12hTo24h('*12:*05 pm') & @CRLF) ; -1Viele Grüße
Sven -
Hallo SOLVE-SMART,
dass war genau das was ich gesucht habe, in meinem String den ich bearbeite, kommt eben nur das Format 08:30 AM/PM vor.
Ganz herzlichen Dank für deine Unterstützung!
-
Gerne 🤝 .
Viele Grüße
Sven -
So gehts auch:
------------------
Local $sZeit = "08:30 PM"If StringRight ( $sZeit, 2) = 'PM' Thenlocal $_i = StringLeft ($sZeit,2)$_i = Number ($_i) +12$_i = String ($_i)$sZeit = $_i & StringMid ($sZeit, 3, 3)else$sZeit = StringLeft ($sZeit, 5)endifMsgBox(0, "Ergebnis", $sZeit ) ;Ausgabe ist: 20:30-------------LG
Peter
-
Das reicht so leider nicht.
Bei diesem Ansatz ergibt die Zeit 12:00 AM ==> 12:00, richtig ist aber 00:00.
Das Gleiche gilt für 12:00 PM ==> 24:00 bei dir, jedoch ist 12:00 korrekt.
Des Weiteren wäre bspw. die invalide Zeit 25:30 auch einfach 25:30 anstatt ein Fehler.Schau' gern nochmal drüber, Danke.
Ich verweise auf die Funktion _Time12hTo24h in Post #3.Viele Grüße
Sven -
AM bedeutet Vormittag (die Zeit zwischen 00:00 und 12:00) ---> 12:00 AM = Mittags 12:00 --> Da stimmt der CodePM bedeutet Nachmittag also den Zeitraum von Mittags(12:01 bis 24:00) bis Mitternacht. Da ist die Auffassung wie folgt:12 Uhr Mitternacht = 24 Uhr und gehört sozusagen zum "alten" Tag d.h. 1. Januar 24:00 da ist der 01. Januar rum. Die nächste Zeitangabe ist dann 0:01 das ist bereits der 2. Januar00:00 Mitternacht ist demzufolge die Zeitangabe die zum 2ten Januar gehört also zum Neuen Tag --- > Der ganze Tag liegt noch vor Dir.--------------------Was im übrigen auch für diese Auffassung spricht ist folgendes... der Tag hat 24 Stunden und wenn wir zählen kommt nach 23:59 24:00 Uhr und nicht 0:00 Uhr.0:00 Uhr ist sozusagen der Start in den neuen Tag 0:00 +23 Stunden und 59 Minuten ergibt 23:59 also kurz vor 24 Uhr....Peter
-
Moin,
ich denke, dass das hier die allgemeine Auffassung in englischspracigen Ländern darstellt:
... wenn die 59. Minute der 11. Stunde abgelaufen ist, beginnt die zweite Tageshälfte um 12 Uhr
... wenn die 59. Minute der 23. Stunde abgelaufen ist, beginnt der neue Tag mit 0 Uhr
-
Fast vergessen: Die AM/PM Zeit entspricht der Anzeige einer analogen 12-stündigen Uhr. Es gibt zweimal am Tag 12 Uhr. Die 12 der ersten Tageshälfte (AM) ist 0 Uhr.
-
AM bedeutet Vormittag (die Zeit zwischen 00:00 und 12:00) ---> 12:00 AM = Mittags 12:00 --> Da stimmt der Code
Das entspricht aber nicht den Standards.
Für die US-Verwaltung z.B. gilt explizit >>folgende Vorgabe<< in deren offiziellen Style-Guide:Code9.54. References to meridian in statements of time are abbreviated as follows: 12 p.m. (12 noon) 12 a.m. (12 midnight)Das handhaben auch alle mir bekannten Online-Converter und Programmierbibliotheken so (einfach mal probieren).
Spannender ist die Behandlung von 00:00 AM/PM. Beide sollte es nicht geben, da im 12h-System nur die Werte 01-12 zugelassen sein sollten.
Manche Konverter bringen daher hierbei einen Fehler, andere lassen zumindest 00:00 AM = 12:00 AM zu. Wirklich undefiniert ist hingegen 00:00 PM.
Halb Eins Nachts ist demzufolge 12:30 AM - 00:30 AM wäre nämlich streng genommen auch nicht zulässig.
Habe es auch mal gerade unter Python probiert und das eingebaute datetime.strptime schmeißt mir im Fall von 00:30:00 AM auch folgerichtig einen Fehler. -
Sorry, auf die Idee dass 12:00 PM mittags um 12 ist bin ich auch gerade erst gekommen.... da es für mich immer Past (nach) war warfür mich alles bis 12:00 vor... Aber das scheint ja sogar im englischsprachigen Raum nicht ganz klar zu sein. Ein (englischer) Freund von mir meinte das würde eh keiner sagen... 12:00 PM sei einfach noon... und 12:00 AM sei midneight....
So gesehen ist also 12 PM mittags um 12 und 12:00 AM eigentlich 0:00 --- womit klar ist mit Am und PM gibt es eigentlich kein 24:00 Uhr. Denn 12 Am ist 0:00 umd 12 PM = 12:00 (mittags)
Da muss ich meinen simplen Source wohl anpassen...
Peter
-
So sollte es nun stimmen:
AutoIt
Alles anzeigenLocal $sZeit = "1:20 AM" Local $_add = 0 Local $_i = '' If StringMid($sZeit, 2, 1) = ":" Then $sZeit = '0' & $sZeit EndIf If (StringRight($sZeit, 2) = 'PM') And (StringLeft($sZeit, 2) <> '12') Then $_add = 12 EndIf If (StringRight($sZeit, 2) = 'AM') And (StringLeft($sZeit, 2) = '12') Then $_add = -12 EndIf $_i = StringLeft($sZeit, 2) $_i = Number($_i) + $_add $sZeit = $_i & StringMid($sZeit, 3, 3) If StringMid($sZeit, 2, 1) = ":" Then $sZeit = '0' & $sZeit EndIf MsgBox(0, "Ergebnis", $sZeit) -
Hour AM/PM ( yes, one more of these ); #FUNCTION# ==================================================================================================================== ; Name...........: HourAmPm ;…www.autoitscript.com
Ich habe ein Testskript (Link oben) für den Patch von ioa747 erstellt, um AM/PM in die Date.au3-UDF zu integrieren.
Ich würde mich freuen, wenn Sie es ausprobieren und mir mitteilen könnten, ob es bei Ihnen funktioniert.
Vielen Dank.