Uhrzeit im englischen AM/PM Format ausgeben

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Uhrzeit im englischen AM/PM Format ausgeben

Beitrag von Rokur »

Hier mal eine kleine Prozedur um eine Uhrzeit im englischen Format (mit AM/PM) auszugeben:

Code: Alles auswählen

Procedure.s zeit(datum.l)
  Protected tageszeit.s = ""
  If Hour(datum) > 12
    datum - 43200 ;12 Stunden abziehen
    tageszeit = "PM"
  Else
    tageszeit = "AM"
  EndIf
  ProcedureReturn FormatDate("%hh:%ii",datum) + " " + tageszeit
EndProcedure

Debug zeit(Date(2009,7,24,11,2,0))
Debug zeit(Date(2009,7,24,14,8,0))
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Es geht auch kürzer, indem man in der Protected-Zeile schon einen Standardwert zuweist :wink:

Code: Alles auswählen

Procedure.s zeit(datum.i) 
  Protected tageszeit.s = "AM" 
  If Hour(datum) > 12 
    datum - 43200 ;12 Stunden abziehen 
    tageszeit = "PM" 
  EndIf 
  ProcedureReturn FormatDate("%hh:%ii",datum) + " " + tageszeit 
EndProcedure 

Debug zeit(Date(2009,7,24,11,2,0)) 
Debug zeit(Date(2009,7,24,14,8,0)) 
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Stimmt der Code schon?

Code: Alles auswählen

Debug zeit(Date(2009,7,24,12,2,0))
12:02 AM
Von 12:00 bis 23:59 sollte es eigentlich PM sein...
Windows 11 - PB 6.03 x64
_________________________________
Benutzeravatar
milan1612
Beiträge: 810
Registriert: 15.04.2007 17:58

Beitrag von milan1612 »

marco2007 hat geschrieben:Stimmt der Code schon?

Code: Alles auswählen

Debug zeit(Date(2009,7,24,12,2,0))
12:02 AM
Ab 12 müßte es PM sein...

Code: Alles auswählen

...
If Hour(datum) >= 12
...
Größergleich 12...
Bin nur noch sehr selten hier, bitte nur noch per PN kontaktieren
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Milan, eigentlich sollte der Urheber nachdenken, wir sind ja hier bei Tipps und Tricks.
Ich brauch den Code ja nicht...mir ist`s nur aufgefallen.
Windows 11 - PB 6.03 x64
_________________________________
Kaeru Gaman
Beiträge: 17389
Registriert: 10.11.2004 03:22

Beitrag von Kaeru Gaman »

... und die stunde nach Mitternacht wird nicht 0:xx AM sondern 12:xx AM geschrieben.
die Mittagsstunde übrigens auch, 0:xx gibt es garnicht.

also, das Ganze ist noch um einiges komplexer als einfach "- 43200"
Der Narr denkt er sei ein weiser Mann.
Der Weise weiß, dass er ein Narr ist.
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

...nur mal schnell gemacht...aber es sollte funken:

Code: Alles auswählen

Procedure.s ampm(yy, mm, dd, hh, ii, ss)
If Date(yy,mm,dd,hh,ii,ss)<0
  ProcedureReturn FormatDate("%yyyy.%mm.%dd %hh:%ii:%ss",Date(yy,mm,dd,hh,ii,ss))
Else
  If Date(yy,mm,dd, hh,ii,ss)>=Date(yy,mm,dd, 0,0,0) And Date(yy,mm,dd, hh,ii,ss)<Date(yy,mm,dd, 12,0,0)
  m.s="AM"
  Else
  m.s="PM"
  EndIf
  If hh%12=0: hh=12: Else: hh=hh%12: EndIf
  ProcedureReturn RSet(Str(hh), 2, "0")+":"+RSet(Str(ii), 2, "0")+":"+RSet(Str(ss), 2, "0")+" "+m
EndIf
EndProcedure

Debug ampm(2009, 12, 5, 23,59,59)  
Debug ampm(2009, 12, 5, 00,00,00)
Debug ampm(2009, 12, 5, 01,00,00)
Debug ampm(2009, 12, 5, 11,59,59)  
Debug ampm(2009, 12, 5, 12,00,00)
Debug ampm(2009, 12, 5, 13,00,00)
Debug ampm(2009, 12, 5, 24,00,00)
...ja, ich weiß, das hier ist häßlich und schlecht :oops:
Thread sollte man auch verschieben...
Windows 11 - PB 6.03 x64
_________________________________
Little John

Beitrag von Little John »

Dieser am/pm-Kram ist doch sowieso aus dem vorletzten Jahrhundert. :twisted:
Gerade jetzt in Zeiten des "Global Village" wäre es nicht schlecht, wenn die Angelsachsen sich mal langsam mit den verschiedenen ISO-Formaten (also auch bei Zeitangaben) vertraut machen würden. Dabei hilft vielleicht folgende Routine, die genau die umgekehrte Umwandlung durchführt.

Code: Alles auswählen

Procedure.s AngloSaxonTime_To_ISO (inTime$)
   ; in : time of day in Anglo-Saxon format, e.g. "12:24:07 a.m." or "1.37 pm"
   ; out: time of day in 24 hour ISO format
   Protected time$, suffix$
   Protected colon, hour

   time$ = ReplaceString(StringField(inTime$, 1, " "), ".", ":")
   colon = FindString(time$, ":", 1)
   If colon = 0
      colon = Len(time$) + 1
   EndIf

   hour = Val(Left(time$, colon-1))
   If hour = 12
      hour = 0
   ElseIf hour < 1 Or hour > 12
      ProcedureReturn ""                 ; error
   EndIf

   suffix$ = LCase(StringField(inTime$, 2, " "))
   If suffix$ = "pm" Or suffix$ = "p.m."
      hour + 12
   ElseIf suffix$ <> "am" And suffix$ <> "a.m."
      ProcedureReturn ""                 ; error
   EndIf

   ProcedureReturn RSet(Str(hour), 2, "0") + Mid(time$, colon)
EndProcedure


;-- Demo
Debug AngloSaxonTime_To_ISO("12:24:07 a.m.")
Debug AngloSaxonTime_To_ISO("12:24:07 p.m.")
Debug AngloSaxonTime_To_ISO("1.37 am")
Debug AngloSaxonTime_To_ISO("1.37 pm")
Gruß, Little John
marco2007
Beiträge: 906
Registriert: 26.10.2006 13:19
Kontaktdaten:

Beitrag von marco2007 »

Little John hat geschrieben:Dieser am/pm-Kram ist doch sowieso aus dem vorletzten Jahrhundert. :twisted:
:allright:
that`s why: Ich brauch den Code ja nicht :D
Windows 11 - PB 6.03 x64
_________________________________
Rokur
Beiträge: 167
Registriert: 29.12.2005 09:58
Computerausstattung: Intel Core2 Quad (4x2,4 GHz), 4096 MB RAM, GForce 8800GTX 786 MB
Windows XP 32 Bit, PureBasic 4.40 (x86)

Beitrag von Rokur »

Ups sorry, da waren ja wirklich noch ein paar Bugs drinnen.

So sollte es jetzt passen:

Code: Alles auswählen

Procedure.s inselzeit(date.l)
  Protected tageszeit.s = "AM"
  Select Hour(date)
    Case 0
      date + 43200
    Case 12
      tageszeit = "PM"
    Case 13 To 23
      date - 43200
      tageszeit = "PM"
  EndSelect
  ProcedureReturn FormatDate("%hh:%ii:%ss",date) + " " + tageszeit
EndProcedure
Und ja, natürlich ist das ein total veraltetes Format, genauso wie Datum in MM/DD/YY Schreibweise, aber deshalb kanns trotzdem vorkommen das man es mal verwenden muss. :wink:
Antworten