Alter bestimmen

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Alter bestimmen

Beitrag von marcelx »

Hallo,

ich habe eine Datum als Text mit folgende Format: <Tag>.<Monat>.<Jahr> (z.B. "23.02.1888")
wie berechne ich das Alter bezogen auf das Datum von Heute?

Danke und Gruß
MarcelX
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Alter bestimmen

Beitrag von Bisonte »

Einfach das Geburtsdatum hochzählen, bis das heutige Datum erreicht ist.
Mal einfach so hingekritzelt....

Code: Alles auswählen

Procedure Alter_Ausrechnen(Date)
  
  Protected Heute = Date()
  Protected Result = 0, tmp = date
  
  ; Datum hochzählen
  While Heute >= tmp
    tmp = AddDate(tmp, #PB_Date_Year, 1)
    Result + 1
  Wend
  
  ; Falls Geburtsdatum innerhalb des Jahres noch nicht erreicht ist...
  If tmp > Date
    Result - 1
  EndIf
  
  ProcedureReturn Result
    
EndProcedure

Datum = Date(1980, 3, 10, 0, 0, 1)

Debug Alter_Ausrechnen(Datum)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Alter bestimmen

Beitrag von marcelx »

Danke für den Ansatz; leider dauert es ewig mit z:B. das Jahr 1888

Ich habe gerade mit eine DB-Lösung probiert und funktioniert:

Code: Alles auswählen

UseSQLiteDatabase()

Enumeration : #Database : EndEnumeration

OpenDatabase(#Database, ":memory:", "", "", #PB_Database_SQLite)

Procedure.s RechneAlter(String$)
  Debug String$
  If DatabaseQuery(#Database, "SELECT cast(strftime('%Y.%m%d', 'now') - strftime('%Y.%m%d', '"+String$+"') as int)")
    If NextDatabaseRow(#Database)
      ProcedureReturn GetDatabaseString(#Database, 0)
    EndIf
    FinishDatabaseQuery(#Database)
  EndIf
EndProcedure 

Debug RechneAlter("1888-03-10")

CloseDatabase(#Database)
Win-10, PB 5.31 (Windows - x86)
NeoChris
Beiträge: 205
Registriert: 21.11.2013 21:17
Wohnort: Schweiz
Kontaktdaten:

Re: Alter bestimmen

Beitrag von NeoChris »

@Bisonte
Die Schleife finde ich unnötig. Du kannst zwei Daten (Plural von Datum) auch subrahieren.

Code: Alles auswählen


Procedure Alter_Ausrechnen(Date)
 
  Protected Heute = Date()
  Protected Result = 0, tmp = date
 
  Result = Year(Heute)-Year(Date)
  
  ; hier noch -1-Abfrage einfügen ob man im letzten Jahr schon Geburtstag hatte!
  
  ProcedureReturn Result
   
EndProcedure

Datum = Date(1980, 3, 10, 0, 0, 1)

Debug Alter_Ausrechnen(Datum)

Benutzeravatar
marcelx
Beiträge: 429
Registriert: 19.02.2010 20:19
Wohnort: Darmstadt

Re: Alter bestimmen

Beitrag von marcelx »

mit Date(1888, 3, 10, 0, 0, 1) ergibt bei Debug Alter_Ausrechnen(Datum) 2015
(weil Datum ist = -1)
Win-10, PB 5.31 (Windows - x86)
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Alter bestimmen

Beitrag von ProgOldie »

Bisontes Lösung setzt voraus, dass das Geburtsdatum zwischen dem 1.1.1970 und dem 19.1.2038 liegt, weil die PB-Bibliothek nur Daten im UNIX-Format verarbeitet. Mit dem von MarcelX vorgegebenen Jahr 1888 geht es also schon 'mal nicht.

Dann muss man per Hand vorgehen. Wenn Tag, Monat, Jahr die vorgegebenen Datumsteile sind, erhält man schon 'mal ohne Iteration mit

Code: Alles auswählen

Alter=year(Date())-Jahr

einen Wert für das Alter in Jahren, der nur dann falsch ist, wenn der Geburtstag im aktuellen Jahr noch nicht erreicht wurde. Also muss man noch prüfen, ob der Geburtstag im aktuellen Jahr erreicht wurde.

Monat < month(Date()) Dann Alter um 1 verringern
Monat =month(Date()) Dann prüfen of Tag <day(Date()) Wenn ja, dann Alter um 1 verringern.
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Benutzeravatar
Kiffi
Beiträge: 10714
Registriert: 08.09.2004 08:21
Wohnort: Amphibios 9

Re: Alter bestimmen

Beitrag von Kiffi »

Die PB-Datumsfunktionen reichen nur bis zum 01.01.1970 zurück.

Wer mit älteren Werten rechnen möchte, der muss wohl oder übel Alternativen suchen (hier und im englischen Forum gibt es bereits entsprechende Routinen).

Die SQLite-Alternative gefällt mir allerdings auch ganz gut...

Grüße ... Peter
a²+b²=mc²
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Alter bestimmen

Beitrag von Bisonte »

ARg... Da hatte ich wieder mal nicht dran gedacht... 1970.... >_<
Das mit dem einfach abziehen macht auch Sinn, aber das erste, was mir beim
Lesen einfiel war die Schleife.... ;)

Aber die SQL Geschichte find ich höchst interessant :allright:
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
ProgOldie
Beiträge: 236
Registriert: 19.05.2012 17:09
Computerausstattung: Windows11, Arduinos, Pi3, PureBasic 6.02

Re: Alter bestimmen

Beitrag von ProgOldie »

Hatte gerade nicht Besseres zu tun.

Code: Alles auswählen

EnableExplicit

Procedure getAlter(Tag.i,Monat.i,Jahr.i)
  Protected.i Alter
  Alter=Year(Date())-Jahr
  If Alter >0   ; Geburtsjahr=aktuelles Jahr-->Alter immer 0
    If Monat > Month(Date())
      Alter-1
    ElseIf Monat=Month(Date())
      If Tag<Day(Date())
        Alter-1
      EndIf
    EndIf
  EndIf
  ProcedureReturn Alter
EndProcedure


MessageRequester("errechnetes Alter",Str(getAlter(23,2,1888)))

//Edited : Falsche Abfrage behoben: If Monat > Month(Date())
Windows10 / PB5.70 / Arduino (-Due) / Raspberry Pi3 /Linux Mint 18
Antworten