Seite 1 von 1

Wieviele "Monate, Tage, Stunden usw." sind vergangen?

Verfasst: 03.05.2011 11:23
von Ghosty
Hallo zusammen...

Ich möchte gerne eine Prozedur bauen, welche mir aus zwei gegebenen Datumswerten
die Differenz in Form eines Strings zurückgibt. Für Sekunden alleine... kein Problem. Aber wenn
ich das so haben möchte wie unten gezeigt, stellt sich das Problem mit den Schaltjahren, den
Tagen pro Monat usw...
Ich werde dabei bald Wahnsinnig. Hat jemand von Euch soetwas schon fertig in irgendeinem
Codeschnipsel rumfliegen oder kennt eine Lösung, welche korrekt rechnet?
Ich wäre sehr dankbar für Hinweise, welche zum Erfolg führen :allright:

BEISPIEL: "Seit dem 10.01.2010 00:00:00 sind 1 Jahr 1 Monat 2 Wochen 5 Tage 4 Stunden 12 Minuten und 13 Sekunden vergangen"
(Hab das nicht nachgerechnet 8) )

Re: Wieviele "Monate, Tage, Stunden usw." sind vergangen?

Verfasst: 03.05.2011 12:42
von Macros
Übergib das ganze an Date,
das gibt dir die Zeit in Sekunden seit dem 1.1.1970 zurück.

2 solche Werte voneinander abgezogen geben einen Unterschied in Sekunden.

Gruß
Macros

Re: Wieviele "Monate, Tage, Stunden usw." sind vergangen?

Verfasst: 03.05.2011 12:53
von NicknameFJ
@Macros
Ghosty hat geschrieben: Für Sekunden alleine... kein Problem.
Grüße
NicknameFJ

Re: Wieviele "Monate, Tage, Stunden usw." sind vergangen?

Verfasst: 03.05.2011 13:15
von STARGÅTE
Was er möchte, bzw ich vermute, ist:

das als Beispiel:
zwischen dem 28.03.2011 und 28.04.2011 genau 1 Monat zurückgegeben wird.
zwischen dem 28.03.2010 und 28.03.2011 genau 1 Jahr zurückgegeben wird.

Da aber ein Monate immer unterschiedlich viele Tage hat, würde ich hier nicht mit den Timestamps arbeiten, sonden einfach die Differenzen der Teil-Dates.

Sodas auch:
zwischen dem 28.02.2011 und 27.03.2011 genau 27 Tage zurückgegeben wird.
zwischen dem 28.03.2011 und 27.04.2011 genau 30 Tage zurückgegeben wird.

Re: Wieviele "Monate, Tage, Stunden usw." sind vergangen?

Verfasst: 03.05.2011 13:18
von shadow
Anhand der Sekunden kannst du die Differenz ermitteln und diese in deinem gewünschten Format angeben.

Einfaches Beispiel für 6003 sekunden:

Code: Alles auswählen

sek.l = 6003 mod 60
min.l = (6003 - sek) mod 60
std.l = (6003 - sek) / 60
...
Kannst es halt natürlich noch schön optimieren und erweitern. Das soll nur ein kleiner Denkanstoß sein ...
Und selbst wenn du eine fertige Funktion durch API&Co. findest, die macht es auch nicht anders, da die Zeitmessung immer in Sekunden zurückgegeben wird (spezielle Funktionen geben sogar Nanosekunden zurück).
Die Schaltjahre und Co. sind in den Sekunden natürlich miteinbezogen.

@STARGATE
Hmm, da könnteste natürlich recht haben. Würde auf jeden Fall bei der Jahres-/Monatsberechnung Sinn machen. Aber selbst das kann man mit ein bissel Nachdenken anhand der Sekunden und des aktuellen Datums machen...
Pseudo-Code:

Code: Alles auswählen

dat = Now()
tage.l = 0
do
  dat - [Ein Tag]
  tage + 1
while dat >= "01.01.2010"

Re: Wieviele "Monate, Tage, Stunden usw." sind vergangen?

Verfasst: 03.05.2011 13:26
von Macros
Dann hatte ich das falsch verstanden.

Bis hin zu Tagen ist es ja eine einfache modulo rechnung:

Code: Alles auswählen

sekunden_anzeige=differenz%60
minuten.i=differenz/60
minuten_anzeige=minuten%60
stunden.i=minuten/60
stunden_anzeige=stunden%24
tage.i=stunden/24
Jetzt kommt der kompliziertere Teil.
Ich würde einfach die Monate durchgehen ab dem aktuellen,
jeweils checken wie viel Tage die haben, und abziehen, bis man keinen vollen Monat mehr beisammen hat.
Dann kann man wieder aus den Monaten mit Modulo die Jahre herausziehen.

Bleiben noch Schaltjahre. Aber mehr als eine if Abfrage beim Februar ist das nicht.
Eine Funktion ähnlich isLeapYear gab es hier mal in einem Thread, einfach die Suche benutzen.

Re: Wieviele "Monate, Tage, Stunden usw." sind vergangen?

Verfasst: 03.05.2011 13:40
von STARGÅTE
So hier mal meine Lösung ...
hab ein paar Test-Datums angefügt, und hoffe das es so gemeint war ^^

Code: Alles auswählen


DataSection
	MonthDays:
	Data.i 0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31
EndDataSection

Procedure MonthDays(Date)
	Protected Days
	Days = PeekI(?MonthDays+SizeOf(Integer)*Month(Date))
	If Month(Date) = 2
		If Not Year(Date) % 4   : Days + 1 : EndIf
		If Not Year(Date) % 100 : Days - 1 : EndIf
		If Not Year(Date) % 400 : Days + 1 : EndIf
	EndIf
	ProcedureReturn Days
EndProcedure

Procedure.s SubDate(Date1, Date2)
	
	Protected Text.s
	Protected Year, Month, Day, Hour, Minute, Second
	
	If Date1 < Date2
		Swap Date1, Date2 : Text = "- "
	EndIf
	
	Year = Year(Date1)-Year(Date2)
	Month = Month(Date1)-Month(Date2)
	Day = Day(Date1)-Day(Date2)
	Hour = Hour(Date1)-Hour(Date2)
	Minute = Minute(Date1)-Minute(Date2)
	Second = Second(Date1)-Second(Date2)
	
	If Second < 0 : Second = 60+Second : Minute - 1 : EndIf
	If Minute < 0 : Minute = 60+Minute : Hour - 1 : EndIf
	If Hour < 0   : Hour = 24+Hour : Day - 1 : EndIf
	If Day < 0    : Day = MonthDays(Date2)+Day : Month - 1 : EndIf
	If Month < 0  : Month = 12+Month : Year - 1 : EndIf
	
	Text + Str(Year)+" Jahr(e) "
	Text + Str(Month)+" Monat(e) "
	Text + Str(Day)+" Tag(e) "
	Text + Str(Hour)+" Stunde(n) "
	Text + Str(Minute)+" Minute(n) "
	Text + Str(Second)+" Sekunde(n) "

	ProcedureReturn Text
	
EndProcedure


Debug SubDate(Date(2011,03,27,0,0,0), Date(2011,02,28,0,0,0)) ; Februar
Debug SubDate(Date(2008,03,27,0,0,0), Date(2008,02,28,0,0,0)) ; Februar , Schaltjar
Debug SubDate(Date(2008,03,27,0,0,0), Date(2008,01,28,0,0,0)) ; Januar , Schaltjar egal
Debug SubDate(Date(2008,02,02,0,0,0), Date(2011,02,01,0,0,0)) ; negativ , Februar , Schaltjar