FormatHTTPDate() & ParseHTTPDate() - HTTP Datumsangaben

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.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

FormatHTTPDate() & ParseHTTPDate() - HTTP Datumsangaben

Beitrag von AND51 »

Hallo!

Ich dachte, ich lasse euch mal an meiner überaus starken Programmierfähigkeit teilhaben, *hüstel* 8) :wink:
Den Code habe ich im Zuge meines Projektes gecoded, aber ich dachte mir: "Warum soll ich den adneren vorenthalten?"

OK, hier beide Codes, ersteinmal:

Code: Alles auswählen

Procedure.s ReplaceStrings(String$, StringsToFind$, StringsToReplace$, Seperator$="|")
	Protected n.l
	For n=1 To CountString(StringsToFind$, Seperator$)+1
		String$=ReplaceString(String$, StringField(StringsToFind$, n, Seperator$), StringField(StringsToReplace$, n, Seperator$))
	Next
	ProcedureReturn String$
EndProcedure
Procedure parseHTTPdate(datum$)
	datum$=Trim(ReplaceStrings(datum$, "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec", "01|02|03|04|05|06|07|08|09|10|11|12"))
	ProcedureReturn ParseDate("Day, %dd %mm %yyyy %hh:%ii:%ss GMT", datum$)
EndProcedure
Procedure.s formatHTTPdate(datum)
	Protected DayOfWeek, res$
	res$=FormatDate(", %dd m%mm %yyyy %hh:%ii:%ss GMT", datum)
	res$=ReplaceStrings(res$, "m01|m02|m03|m04|m05|m06|m07|m08|m09|m10|m11|m12", "Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec")
	ProcedureReturn StringField("Sun,Mon,Tue,Wed,Thu,Fri,Sat", DayOfWeek(datum)+1, ",")+res$
EndProcedure
Läuft auf 3.94 und 4.00, bei 3.94 muss nur ParseHTTPDate() eben ganz kurz angepasst werden. Die ReplaceStrings() Prozedur wird von beiden anderen Proceduren gebraucht, kann aber auch einzeln für andere Zwecke genutzt werden! Sie kann mehrere einzelne ReplaceString()-Aufrufe ersetzen; diese Prozedur habe ich schon früher in einem anderen Thread gepostet.


Wirkung/Nutzen: Man kann Datumsangaben gemäß dem HTTP-Protokoll erstellen und einlesen! Diesen Beitrag schrieb ich Beispielsweise laut HTTP-Datum am/um:

Code: Alles auswählen

Wed, 20 Sep 2006 15:54:56 GMT
Diese Datumsangaben sind Sprachunabhängig und haben immer dieses Schema, können somit besser maschinell eingelesen werden. Die Benutzung des Codes ergibt sich von selbst, hier nochmal eine kurze Erläuterung:

formatHTTPdate(datum) — Wandelt ein Datum, das als Zahl vorliegt, in einen HTTP-Datumsstring um
parseHTTPdate(datum$) — Wandelt einen HTTP-Datumsstring, wie die andere Prozedur ihn erzeugt, zurück in ein zahlendatum um, welches z. B. direkt mit den PB-internen Date-Befehelen verarbeitet werden kann.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

Ist ja schön, aber stimmt nicht.
Da kommen doch keine GMT-Zeiten raus.

Ausserdem wäre dein Beitrag um Wed, 20 Sep 2006 14:00:40 GMT geschrieben, da wir momentan 2 Stunden hinter GMT sind.

Übrigens interessant, dass dieses m%mm vertippte m gar nicht im String auftaucht.

[Edit]
Ach ja, so als Beweis:
http://wwp.greenwichmeantime.com/
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Schön, dass du dir diesen Code angeschaut hast! Ehrlich gesagt bringt mich diese Foreneinstellung mit GMT Zeitzonen durcheinander :freak: ABER:
Die zeit ist korrrekt, habe sie mit meiner Wanduhr verglichen! 8)


das m%mm getippe ist Absicht und kein Fehler! Denn Angenommen, wir haben ja den 9. Monat (also September). Wenn Ich aber irgend ein Datum habe, wo die 9. Stunde ist, also z. B. 9:52, dann kommt das Skript durcheinander und hält die Monate für Stunden.
Nene, das it absolut korrekt.


@ [Edit:] Ich habe nocheinmal meine PC-Uhrzeit mit formatHTTPdate() ausgegeben, die Uhrzeit stimmt mit meiner Wand sowie Armbanduhr und deiner Webseite überein, ich sehe also keinen Fehler! Es geht ja übrigens um die Berücksichtigung der zeitzone, falls du das meinst.

Möglicherweise bin ich jetzt vollends durcheinander :freak: ABER

Fakt ist, ich will die Uhrzeit in HTTP-Datum konvertieren, die mir z. B. meine Armbanduhr anzeigt. Also keine globale Standardzeit oder sowas. Ich bitte allgemein um Antwort, vielleicht fällt dem ein oder anderen was dazu ein oder möchte endlich mal ein Lob loswerden! :D

Sollte jemand unzufrieden sein, kann er gern manuell die 2 Stunden hinzfügen oder abziehen!
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Toll, viel Wind um nichts:
> Ausserdem wäre dein Beitrag um Wed, 20 Sep 2006 14:00:40 GMT geschrieben
Falsch! Das kommt daher, dass ich meinen Beitrag nachträglich editiert habe um 2 kleine Schreibfehler auszmerzen.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
HeX0R
Beiträge: 3040
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Beitrag von HeX0R »

AND51 hat geschrieben:Toll, viel Wind um nichts:
> Ausserdem wäre dein Beitrag um Wed, 20 Sep 2006 14:00:40 GMT geschrieben
Falsch! Das kommt daher, dass ich meinen Beitrag nachträglich editiert habe um 2 kleine Schreibfehler auszmerzen.
Hmm... und das hast du exakt (+- 5 Minuten Toleranz) zwei Stunden später gemacht ?

Egal.
Eigentlich dachte ich ja, dass du vorhast einen PB-Date() - Zeitstempel in ein GMT-Format umzuwandeln, so aber muss man ja als datum schon einen GMT-Datestamp einfüttern (also selbst umrechnen).

...oder bin ich jetzt auch verwirrt ? :freak:

[TestEdit]
Zuletzt geändert von HeX0R am 20.09.2006 21:39, insgesamt 1-mal geändert.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich glaube, der Zeitunterschied zwischen dem 1. Posting und dem nachträglichen Editiren ist so groß, weil ich erst relativ spät germerkt habe, dass ich bei formatHTTPdate() das H vergessen habe. Das merkte ich erst, als ich in meinem Editor mit der Fuunktion arbeiten wollte.


Ich glaube, du bist jetzt verwirrt, weil:

Der Benutzer soll mit dem Code eine beliebige zahl, die z. B. von Date() zurückgegeben wird, in einen GMT zeitstemnpel umrechnen können, das macht meine przedur formatHTTPdate().

Mit der adneren prozedur soll der Benutzer einen fertigen GMT Zeitstempel wieder in eine PB Date()-zahl zurückwandeln können, das macht meine parseHTTPdate() Prozedur. Diese funktionen braucht man, wenn man wie ich gerade einen HTTP-Webserver schreibt <)
Ob das Datum korrekt ist, bleibt dem Nutzer überlassen, ich liefere nur das Werkzeug (den ALgorithmus) dafür.

formatHTTPdate() macht: Wed, 20 Sep 2006 14:00:40 GMT => 12345678
parseHTTPdate() macht: 12345678 => Wed, 20 Sep 2006 14:00:40 GMT

ich habe die Funktionen ähnlich wie die internen funktionen von PB genannt, um sie sich leichter merken zu können:

formatHTTPdate() entspricht FormatDate()
parseHTTPdate() entspricht ParseDate()

ich hoffe, du hast es jetzt verstanden :wink:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
flype
Beiträge: 15
Registriert: 28.02.2006 23:03
Wohnort: France, Nantes

Beitrag von flype »

hi,

(sorry in english)

if you need for timezone support (both RFC822 and ISO8601)
you might use this functions :

http://www.purebasic.fr/english/viewtop ... hlight=gmt

:wink:
Bild Bild
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Thank you for your comment :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
sharkpeter
Beiträge: 474
Registriert: 29.08.2004 16:18
Wohnort: Dresden
Kontaktdaten:

Re: FormatHTTPDate() & ParseHTTPDate() - HTTP Datumsangaben

Beitrag von sharkpeter »

Hallo AND51,

genau das was ich gestern brauchte. Hat mir ein wenig Arbeit gespart, danke ;)

Gruß Jens
PB3.94 bis 6.xx / (Win98/98SE/ME/XPProSP3/WINVista-X32)/WIN7HP-X64/WIN8PRO-X32/WIN10-64

Nichts wissen macht nichts, sich dumm stellen aber schon.
Antworten