German Rechnen mit Datum

peternmb

Well-Known Member
Licensed User
Longtime User
Hallo,
bei der Updateprüfung in meiner App möchte ich dem Nutzer die Möglichkeit für 7 Tage Pause geben.
Ich speichere dafür eine Dummydatei, deren Datum ich dann auslese, nur klappt das mit dem Hinzurechnen der 7 Tage nicht.
B4X:
 If File.LastModified(File.DirInternal,"Update.txt")+7 > DateTime.Date(DateTime.Now) Then
ich erhalte diese Fehlermeldung mit der ich nichts anfangen kann
java.lang.NumberFormatException: multiple points
 

BlueVision

Well-Known Member
Licensed User
Longtime User
Das kann meiner Ansicht nach nicht so funktionieren, Du kannst da nicht einfach eine 7 hinzuaddieren. Ich denke das bekommst Du einfach mit dem "TimeAdd"-Befehl hin. Das müsste etwa in dieser Weise funktionieren (ich habe das jetzt extra nicht als Code markiert, weil er so natürlich nicht funktioniert und nur als Beispiel für Dich dienen soll). Entscheidend ist der Wert in Bold. Getestet habe ich das jetzt aber nicht, nur schnell hingeschmiert, weil bisher keine Antwort kam auf Deine Frage.

Zuerst weist Du der Variablen FutureDate den Wert zu:

Dim FutureDate As Long
FutureDate = File.LastModified(File.DirInternal,"Update.txt")


Dann fügst Du zu diesem Wert 7 Tage hinzu:

FutureDate = DateTime.Add(FutureDate, Years as Int, Months as Int, Days as Int)
Log("FutureDate is: " & DateTime.Date(FutureDate))


Anschließend musst Du diesen Wert nur noch mit DateTime.DateTime(Now) vergleichen. Klar kann man das auch in einer Codezeile hinbekommen, wäre hier jetzt aber nicht so übersichtlich.
 

DonManfred

Expert
Licensed User
Longtime User
Ich speichere dafür eine Dummydatei, deren Datum ich dann auslese, nur klappt das mit dem Hinzurechnen der 7 Tage nicht.
Das Datum was in der Datei steht zu VERHEIMLICHEN ist allergrößter MIST.
Wie zuum Teufel soll dir jemand helfen können wenn er ABSOLUT NULL INFORMATIONEN von Dir bekommt?

Du musst das Datum (in welcher Form auch immer es in der Datei steht)
- Zuerst in einen LONG-Wert umwandeln.
- Dann kannst Du mit den B4X Dateutils Befehlen mit einem Datum rechnen.


B4X:
    Dim datum As String = "25.01.2026"
    DateTime.DateFormat = "dd.MM.yyyy"
    Dim datevalue As Long = DateTime.DateParse(datum)
    Dim p As Period
    p.Days = 7
    Dim newdate As Long = DateUtils.AddPeriod(datevalue, p)
    
    Log(DateTime.Date(newdate))

PS: Rechne nicht damit dass ich mir noch weiter irgendwelche Mühen gebe Dir zu Antworten.
 
Last edited:

peternmb

Well-Known Member
Licensed User
Longtime User
Das Datum was in der Datei steht zu VERHEIMLICHEN ist allergrößter MIST.
Wie zuum Teufel soll dir jemand helfen können wenn er ABSOLUT NULL INFORMATIONEN von Dir bekommt?

Du musst das Datum (in welcher Form auch immer es in der Datei steht)
Ich verstehe nicht was du mit Verheimlichen meinst.
In der Datei steht nichts, die Information die ich speichere und mit der ich arbeiten bzw. rechnen möchte ist das Datum der Datei nicht der Inhalt.

Danke für den Hinweis auf DateUtils. Mir war nicht bekannt, dass ich dazu zusätzliche Funktionen benötige. Beim Programmieren unter Windows kann ich direkt mit dem Darltum rechnen wie in meinem Beispielversuch.

PS. Welche Informationen fehlen bei meiner Frage???
 

BlueVision

Well-Known Member
Licensed User
Longtime User
Ich denke DonManfred hat Deinen Post einfach falsch interpretiert. Du versteckst ja das Datum nicht in der Datei, sondern liest so wie ich das verstehe das Erstellungsdatum der Datei selbst aus. Wie auch immer, der Lösungsansatz von Don Manfred ist vielleicht auch etwas eleganter als der bei mir.
Ein Gedanke dazu noch:
Ich packe in meiner App gleich in den Namen einer Updatedatei das Datum. Das ist einfacher.
 
Last edited:

DonManfred

Expert
Licensed User
Longtime User
hat Deinen Post einfach falsch interpretiert. Du versteckst ja das Datum nicht in der Datei, sondern liest so wie ich das verstehe das Erstellungsdatum der Datei selbst aus
in der Tat habe ich dieses Detail übersehen 🙈
 

peternmb

Well-Known Member
Licensed User
Longtime User
Das Ausrechnen des Enddatums klappt prima, nur beim Vergleichen bekomme ich eine Fehlermeldung.
Ich finde dazu auch nichts hilfreiches in der Beschreibung von DateUtils.
B4X:
            Dim d As Long
            d = File.LastModified(File.DirInternal,"Update.txt")
            Dim datum As String = DateTime.Date(d)
            DateTime.DateFormat = "dd.MM.yyyy"
            Dim datevalue As Long = DateTime.DateParse(datum)
            Dim p As Period
            p.Days = 7
            Dim newdate As Long = DateUtils.AddPeriod(datevalue, p)
            '
            Log("Dateidatum: " & DateTime.Date(d))
            Log("Heute: " & DateTime.Date(DateTime.Now))
            Log("Update ab: " & DateTime.Date(newdate))
            '
            If DateTime.Date(DateTime.Now) < DateTime.Date(newdate) Then
                Log("kein Update suchen")
            Else   
                Log("Update suchen")
            End If
Dateidatum: 23.01.2026
Heute: 26.01.2026
Update ab: 30.01.2026
main$ResumableSub_Activity_Createresume (java line: 4433)
java.lang.NumberFormatException: multiple points
at jdk.internal.math.FloatingDecimal.readJavaFormatString(FloatingDecimal.java:1914)
at jdk.internal.math.FloatingDecimal.parseDouble(FloatingDecimal.java:110)
at java.lang.Double.parseDouble(Double.java:662)
 

peternmb

Well-Known Member
Licensed User
Longtime User
Ich konnte es jetzt viel einfacher mit der mir vorher unbekannten Funktion "DateUtils.PeriodBetweenInDay " lösen:
B4X:
Dim d As Long = File.LastModified(File.DirInternal,"Update.txt")
Log("Dateidatum: " & DateTime.Date(d))
'
Dim heute As Long = DateTime.Now
Log("Heute: " & DateTime.Date(heute))
'
Dim zeit As Period
zeit=DateUtils.PeriodBetweenInDays(d,heute )
Log(zeit.days)
'      
If zeit.Days < 7 Then
    Log("kein Update suchen")
Else
    Log("Update suchen")
End If
 

BlueVision

Well-Known Member
Licensed User
Longtime User
Alles basiert auf sogenannten Ticks (Millisekunden seit Anno Knack, ich glaube das war der 1.1.1970 00:00:00 UTC). Dein Vergleich im Post #8 schlägt fehl, weil ein Datum dann prinzipiell ein String ist, der aus diesen Ticks errechnet wird. Für den Vergleich müsstest Du dann wieder die Strings vorher in Ticks umrechnen.
Im Post #9 ist das elegant gelöst und Du bekommst das Umwandlungsproblem gar nicht erst.
 
Top