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

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Ghosty
Beiträge: 17
Registriert: 10.04.2005 00:27

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

Beitrag 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) )
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

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

Beitrag 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
Bild
Benutzeravatar
NicknameFJ
Beiträge: 324
Registriert: 03.06.2007 14:36
Wohnort: Von der Sonne aus gesehen der dritte Planet

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

Beitrag von NicknameFJ »

@Macros
Ghosty hat geschrieben: Für Sekunden alleine... kein Problem.
Grüße
NicknameFJ
PS: Alle im Text enthaltenen Schreibfehler sind beabsichtigt und dienen der Belustigung aller

Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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.
Zuletzt geändert von STARGÅTE am 03.05.2011 13:27, insgesamt 1-mal geändert.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
shadow
Beiträge: 189
Registriert: 23.03.2005 17:52
Wohnort: Lübeck

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

Beitrag 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"
ThinkPad T61 (in Gedenken) | PureBasic 4.61 B1 (32) | Windows 7 (32SP1) | ArchLinux (32) | Syllable (32)
Benutzeravatar
Macros
Beiträge: 1361
Registriert: 23.12.2005 15:00
Wohnort: Olching(bei FFB)
Kontaktdaten:

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

Beitrag 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.
Bild
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

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

Beitrag 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
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Antworten