Seite 1 von 1

Datumsdifferenz berechnen !

Verfasst: 10.04.2005 00:40
von Ghosty
Hallo Leute...

Ich programmiere eigentlich in VB, habe mich nun aber mal PureBasic
zugewendet, um mal etwas anderes auszuprobieren.

Ich vermisse allerdings schon direkt eine Funktion bzw. Möglichkeit in PB
folgende Aufgabe zu lösen:

Die Differenz zweien Datumsangaben soll ausgegeben werden.
In VB ging das sehr einfach mit der DateDiff-Function
Beispiel wert=DateDiff("h","02.01.2005 00:00:00","01.01.2005 20:00:00")
gibt für wert 24 zurück (Kürzel "h" für Stunden).

Wie kann ich soetwas in PB realisieren ?
Also ich möchte einfach zwei strings an eine function übergeben und dieser
auch angeben, was berechnet werden soll also Tage, Stunden, Minuten...
ungefähr so

Procedure PBDateDiff (modus, Datum1$, Datum2$)

z.B. Procedure PBDateDiff (0,"01.01.2005 20:00:00", "02.01.2005 20:00:00")


Bitte, bitte... kann mir einer da weiterhelfen (am besten mit source)

thx... Ghosty :(

Verfasst: 10.04.2005 05:14
von crossroads
Der Schlüssel zur Lösung Deines Problems ist die Funktion ParseDate(Maske$, String$)
Die folgende Procedure ist eigentlich selbsterklärend und kann die Differenz zweier Daten in Sekunden, Minuten, Stunden, Tagen oder Wochen als Integerwert zurückgeben:

Code: Alles auswählen

Procedure.l PBDateDiff (modus$, Datum1$, Datum2$)
  d1.l = ParseDate("%dd.%mm.%yyyy %hh:%ii:%ss", Datum1$) 
  d2.l = ParseDate("%dd.%mm.%yyyy %hh:%ii:%ss", Datum2$)
  If d1 < 0 Or d2 < 0:ProcedureReturn -1:EndIf ; error!
  diff.l = Abs(d2 - d1)
  Select modus$
    Case "s":ProcedureReturn diff  ; seconds
    Case "m":ProcedureReturn Int(diff / 60) ; minutes
    Case "h":ProcedureReturn Int(diff / (60 * 60)) ; hours
    Case "d":ProcedureReturn Int(diff / (60 * 60 * 24)) ; days
    Case "w":ProcedureReturn Int(diff / (60 * 60 * 24 * 7)) ; weeks
    Default:ProcedureReturn -1 ; error!
  EndSelect
EndProcedure

Debug PBDateDiff ("d","10.04.2005 00:00:00", "17.04.2005 00:00:00")
Ist etwas schiefgelaufen (inkorrekte(r) Parameter), wird -1 zurückgeliefert.

Einschränkungen (Auszug aus der PB-Hilfe):
Die 'Date' (Datums) Library ermöglicht den Umgang mit Datums- und Zeitangaben von 1970 bis 2034. Benutzt wird dabei der Unix-Typ (Anzahl der seit dem 1. Januar 1970 vergangenen Sekunden).

Verfasst: 10.04.2005 07:19
von Ghosty
...habs mir doch gedacht, das hier der Schlüssel zu suchen ist. Leider
schweigt sich die normale PB-Hilfe etwas zu sehr über ParseDate aus.

Dein Vorschlag klappt... ich danke Dir vielmals !!!

:allright: Ghosty

Verfasst: 10.04.2005 12:26
von Kiffi
crossroads hat geschrieben:
Die 'Date' (Datums) Library ermöglicht den Umgang mit Datums- und
Zeitangaben von 1970 bis 2034. Benutzt wird dabei der Unix-Typ (Anzahl der
seit dem 1. Januar 1970 vergangenen Sekunden).
das mit dem Unix-Typ habe ich nun schon öfter gelesen. Ich habe es noch
nicht ausprobiert, aber was ist denn, wenn's um ein Datum geht, das vor
1970 lag?

Grüße ... Kiffi

Verfasst: 10.04.2005 12:31
von Kaeru Gaman
dann musst du das julianische datum benutzen.
das ist eine fortlaufende ganzzahl für die tage.

...gabs auch schonmal n thread drüber, ich glaub von maurizio.
ich meine mich zu erinnern, dass auch die formel in nem post stand.

und wiki dürfte auch etliches drüber zu erzählen haben.

Verfasst: 10.04.2005 13:00
von Kiffi
> dann musst du das julianische datum benutzen.

danke für die Info!

Grüße ... Kiffi

PBDateDiff auch mit Wochentagen

Verfasst: 22.06.2012 08:07
von kunstlust
crossroads hat geschrieben:Der Schlüssel zur Lösung Deines Problems ist die Funktion ParseDate(Maske$, String$)
Die folgende Procedure ist eigentlich selbsterklärend und kann die Differenz zweier Daten in Sekunden, Minuten, Stunden, Tagen oder Wochen als Integerwert zurückgeben:

Code: Alles auswählen

Procedure.l PBDateDiff (modus$, Datum1$, Datum2$)
  d1.l = ParseDate("%dd.%mm.%yyyy %hh:%ii:%ss", Datum1$) 
  d2.l = ParseDate("%dd.%mm.%yyyy %hh:%ii:%ss", Datum2$)
  If d1 < 0 Or d2 < 0:ProcedureReturn -1:EndIf ; error!
  diff.l = Abs(d2 - d1)
  Select modus$
    Case "s":ProcedureReturn diff  ; seconds
    Case "m":ProcedureReturn Int(diff / 60) ; minutes
    Case "h":ProcedureReturn Int(diff / (60 * 60)) ; hours
    Case "d":ProcedureReturn Int(diff / (60 * 60 * 24)) ; days
    Case "w":ProcedureReturn Int(diff / (60 * 60 * 24 * 7)) ; weeks
    Default:ProcedureReturn -1 ; error!
  EndSelect
EndProcedure

Debug PBDateDiff ("d","10.04.2005 00:00:00", "17.04.2005 00:00:00")
Ist etwas schiefgelaufen (inkorrekte(r) Parameter), wird -1 zurückgeliefert.

Einschränkungen (Auszug aus der PB-Hilfe):
Die 'Date' (Datums) Library ermöglicht den Umgang mit Datums- und Zeitangaben von 1970 bis 2034. Benutzt wird dabei der Unix-Typ (Anzahl der seit dem 1. Januar 1970 vergangenen Sekunden).
Die Procedure ist super, ich wollte einen kleines Tool zu versenden von Urlaubsanträgen schreiben, darum meine Frage: Gibt es die Möglichkeit in PB die Wochentage auszugeben, da ja nur so eine Berechnung der Urlaubstage möglich ist? Oder ist diese Procedure leicht um diese Funktion zu erweitern?

Re: PBDateDiff auch mit Wochentagen

Verfasst: 22.06.2012 11:39
von Nino
kunstlust hat geschrieben:Gibt es die Möglichkeit in PB die Wochentage auszugeben
Kuck mal in der Hilfe bei DayOfWeek().

Datumsdifferenz berechnen !

Verfasst: 22.06.2012 12:08
von kunstlust
Danke, ich hab es erst Hilfe erst nicht gefunden.

Re: Datumsdifferenz berechnen !

Verfasst: 23.06.2012 09:21
von Berti27
Hallo,
Im Jahre 2008 habe ich ein kleines Kalenderprogramm unter [url]http://forums.purebasic.com/german/view ... 8db38e6fed [url] hier reingestellt. Vielleicht findest Du dort etwas was Dir weiterhilft. Die von mir verwendete Datumsberechnung kennt nach hinten heraus nur die Umstellung vom Julianischen auf den heute gültigen Gregorianischen Kalender.