German Aktuelles Alter aus Datum berechnen

Lothar Kriegerow

Active Member
Hallo,
ich habe mal wieder ein Problem. Ich würde gern das Alter einer Person in Jahren berechnen.
In Basic würde ich DateDiff("yyyy", Geburtsdatum, NOW) verwenden. Leider gibt es das in B4A nicht.
Sicher gibt es eine einfache Lösung. Trotz ewigem googeln finde ich aber keine Lösung.

Kann mir bitte mal jemand auf die Sprünge helfen?

Gruß Lothar
 

Heinz

Active Member
Licensed User
Longtime User
Da müßte doch in der DateUtils-Lib (Standard-Lib bei B4A) was dabei sein.
Die einfach bei den Bibliotheken aktivieren:
Hier steht auch was dazu (etwas weiter unten) :
 

GMan

Well-Known Member
Licensed User
Longtime User
Probier dies mal aus:

B4X:
Dim diff As Period
DateTime.DateFormat="dd.MM.yyyy HH:mm:ss"
diff = DateUtils.PeriodBetweenInDays(DateTime.Now, DateTime.DateParse("27.07.2016 23:59:59"))
Label1.Text = diff.Days
 

Lothar Kriegerow

Active Member
Vielen Dank. Ihr habt mir sehr geholfen.
@Heinz. Auf die Idee bin ich nicht gekommen. Oh mein Gott!

@ GMan - Danke. Das wars, was ich suchte. Ich habe es noch für mich angepasst. Genau so wollte ich das.


B4X:
    Dim diff As Period
    Dim DifJ As Int
    DateTime.DateFormat="dd.MM.yyyy"
    diff = DateUtils.PeriodBetweenInDays(DateTime.Now, DateTime.DateParse("07.03.1961"))
    DifJ=Abs(diff.days/365)
    Log(DifJ)

Gruß Lothar
 

Heinz

Active Member
Licensed User
Longtime User
Es ist halt bei B4A immer etwas mühselig, alle Funktionen heraus zu finden,
da sie ja oft versteckt in den B4A-eigenen und zusätzlichen Libraries sind.
Eine standardmäßige Beschreibung fehlt da oft. Diese muß man sich dann
eben im Forum unter Library-Updates heraussuchen.
 

Lothar Kriegerow

Active Member
Hallo Heinz,

das stimmt - aber zum Glück gibt es dieses Forum. Hier gibt es immer kompedente Hilfe. Auch treiben sich hier keine Spinner rum, so wie in ALLEN andern Foren.
Gruß Lothar
 

PaulMeuris

Active Member
Licensed User
Und hier ist die Rechnung mit den Schaltjahren (leapyears):
B4X:
    Dim diff As Period
    Dim DifJ As Int
    DateTime.DateFormat="dd.MM.yyyy"
    diff = DateUtils.PeriodBetweenInDays(DateTime.DateParse("07.03.1961"),DateTime.DateParse("06.03.2023"))
    Log("day difference: " & diff.Days)
    Dim lyears As Int = number_of_leapyears(1961,2023)
    Log("number of leapyears: " & lyears)
    Log("years without leapyear: " & Round((diff.Days-(lyears*366))/365) )
    DifJ=Abs(((diff.days-(lyears*366))/365)+lyears)
    Log("correct age: " & DifJ)
    ' without leapyear days
    DifJ=Abs(diff.days/365)
    Log("age without leapyears: " & DifJ)

private Sub number_of_leapyears(startyear As Int, endyear As Int) As Int
    Dim numyears As Int = 0
    For yr = startyear To endyear
        If yr Mod 4 = 0 Then
            numyears = numyears + 1
        End If
    Next
    Return numyears
End Sub

'Schaltjahr Berechnung: Ein Schaltjahr ist, wenn
'
'Die Jahreszahl durch 4 teilbar ist.
'Ausnahme 1: Ist die Jahreszahl durch 100 teilbar ist i.d.R. KEIN Schaltjahr.
'Ausnahme 2: Ist die Jahreszahl durch 400 teilbar ist IMMER ein Schaltjahr.
'D.h. 2000, 2400 und 2800 Sind Schaltjahre.
Am "06.03.2023" war diese Person 61 und am "07.03.2023" war diese Person 62.
 

Lothar Kriegerow

Active Member
Hallo Paul,


das ist natürlich noch genauer. Danke.
Vor allem gefällt mir, dass ich auch ein Alter berechnen kann, z.B wie alt eine Person am XX.XX.19XX war.

Gruß Lothar

Sorry, aber deine Ausführung der Ausnahmen 1 und 2 unten verstehe ich nicht wirklich. Wann tritt Ausnahme1 ein? Demnach wäre 2100 KEIN Schaltjahr?
 

OliverA

Expert
Licensed User
Longtime User
B4X:
    Dim diff2 As Period = DateUtils.PeriodBetween(DateTime.DateParse("07.03.1961"),DateTime.DateParse("06.03.2023"))
    Log(diff2.Years)

 

Lothar Kriegerow

Active Member
@Danke - wieder was gelernt

@OliverA - Ich weiß nicht, wie ich das Datumsformat umstellen muss. So funktioniert es leider nicht.
Ich bekomme den Fehler:

java.text.ParseException: Unparseable date: "07.03.1961"

B4X:
 DateTime.DateFormat = "dd.MM.yyyy"
  Dim diff2 As Period = DateUtils.PeriodBetween(DateTime.DateParse("07.03.1961"),DateTime.DateParse("06.03.2023"))

Gruß Lothar
 

PaulMeuris

Active Member
Licensed User
Lothar,
Die erste Linie solte da sein.
Also:
B4X:
DateTime.DateFormat="dd.MM.yyyy"
Dim diff2 As Period = DateUtils.PeriodBetween(DateTime.DateParse("07.03.1961"),DateTime.DateParse("06.03.2023"))
Log(diff2.Years)
Wenn die erste Linie nicht da ist, bekommen Sie den Fehler.
 

Lothar Kriegerow

Active Member
Hallo Paul,

ich sehe jetzt keinen Unterschied zu meinem Code. Bin ich blind? Die Zeile steht doch bei mir auch an 1. Stelle drin. Trotzdem erscheint der Fehler.

Gruß Lothar
 

Lothar Kriegerow

Active Member
Hallo Paul,

ich habe gerade mal ein neues Projekt erstellt. Komischer Weise funktioniert das hier. Mein Originalprojekt ist etwas größer. Ich glaube nicht, dass sich da wer durcharbeitet.
Keine Ahnung wo ich da was verbiege. Ich werde mal forschen. Auf alle Fälle funktioniert dieser Einzeiler einwandfrei.

Gruß Lothar

B4X:
#Region  Project Attributes
        #ApplicationLabel: Testprojekt
    #VersionCode: 20221003
    #VersionName: Version 05.04.2023
    #SupportedOrientations: portrait
    #CanInstallToExternalStorage: True
#End Region

#Region  Activity Attributes
    #FullScreen: False
    #IncludeTitle: True
#End Region

Sub Process_Globals
    'These global variables will be declared once when the application starts.
    'These variables can be accessed from all modules.
    Private xui As XUI
End Sub

Sub Globals
    'These global variables will be redeclared each time the activity is created.
End Sub

Sub Activity_Create(FirstTime As Boolean)
    Activity.LoadLayout("Layout")
End Sub


Sub Button1_Click
    DateTime.DateFormat="dd.MM.yyyy"
    Dim diff2 As Period = DateUtils.PeriodBetween(DateTime.DateParse("07.03.1961"),DateTime.DateParse("06.03.2023"))
    Log(diff2.Years)
End Sub
 

OliverA

Expert
Licensed User
Longtime User
Funktioniert in
B4J 9.80 / Java 14.0.1
B4A 12.20 / Java 11.0.1
 

Attachments

  • DateUtilsAge.zip
    14 KB · Views: 136
Top