German Differenz in Ticks zwischen zwei Datum/Uhrzeit Angaben

Wosl

Member
Hallo!

Eigentlich ist das eine leichte Aufgabe oder doch nicht?

Ich versuche die Zeit zwischen zwei Datum/Uhrzeit Angaben zu berechnen. Im Forum gibt es reichlich Posts zu dem Thema und deshalb dachte ich, die Lösung ist klar:

B4X:
Sub Activity_Create (FirstTime As Boolean)
    Dim xZeitGap As Double
    
    Log ("In a month:")
    xZeitGap = CalcDiffTime2 ("13.10.2024", "23:59:59", "14.10.2024", "00:00:00")
    
    Log (" ")
    Log ("Cross month:")
    xZeitGap = CalcDiffTime2 ("31.10.2024", "23:59:59", "01.11.2024", "00:00:00")
    
    Log (" ")
    Log ("Cross month (other choice):")
    xZeitGap = CalcDiffTime2 ("30.09.2024", "23:59:59", "01.10.2024", "00:00:00")
    
    Log (" ")
    Log ("Cross month (leap year):")
    xZeitGap = CalcDiffTime2 ("29.02.2024", "23:59:59", "01.03.2024", "00:00:00")

    Log (" ")
    Log ("Cross year:")
    xZeitGap = CalcDiffTime2 ("31.12.2023", "23:59:59", "01.01.2024", "00:00:00")

    Log ("Job done")
    KillApp
End Sub
Sub CalcDiffTime2 (cDate1 As String, cTime1 As String, cDate2 As String, cTime2 As String) As Double

    Private iStartTime As Long, iEndTime As Long
    Private t As Long
    Dim DiffHours As Double

    Log ("Date from: " & cDate1 & "; Time from: " & cTime1)
    Log ("Date to:   " & cDate2 & "; Time to:   " & cTime2)

    DateTime.DateFormat = "DD.mm.yyyy"
    DateTime.TimeFormat = "HH:mm:ss"

    iStartTime = DateTime.DateTimeParse(cDate1,cTime1)
    iEndTime   = DateTime.DateTimeParse(cDate2,cTime2)
    Log ("iStartTime: " & iStartTime & "; iEndTime: " & iEndTime)
    t = iEndTime - iStartTime
    Log ("Diff: " & t)
    DiffHours = t / (1000.0 * 60.0 * 60.0)

    Return DiffHours
End Sub

Offenbar ist es mir nicht klar ... Der Output ist:
B4X:
In a month:
Date from: 13.10.2024; Time from: 23:59:59
Date to:   14.10.2024; Time to:   00:00:00
iStartTime: 1705187399000; iEndTime: 1705187400000
Diff: 1000
 
Cross month:
Date from: 31.10.2024; Time from: 23:59:59
Date to:   01.11.2024; Time to:   00:00:00
iStartTime: 1706742599000; iEndTime: 1704064260000
Diff: -2678339000
 
Cross month (other choice):
Date from: 30.09.2024; Time from: 23:59:59
Date to:   01.10.2024; Time to:   00:00:00
iStartTime: 1706656139000; iEndTime: 1704064200000
Diff: -2591939000
 
Cross month (leap year):
Date from: 29.02.2024; Time from: 23:59:59
Date to:   01.03.2024; Time to:   00:00:00
iStartTime: 1706569319000; iEndTime: 1704063780000
Diff: -2505539000
 
Cross year:
Date from: 31.12.2023; Time from: 23:59:59
Date to:   01.01.2024; Time to:   00:00:00
iStartTime: 1675206719000; iEndTime: 1704063660000
Diff: 28856941000
Job done

In allen fünf Fällen sollte als Ergebnis (Diff: 1000, also 1 Sekunde) herauskommen. Sobald die Zeitabfrage aber über eine Monats- oder Jahresgrenze geht, kommt Unsinn raus.

Kann mir einer auf die Sprünge helfen, was ich hier falsch mache? Auch Schaltjahre und Sommer/Winterzeit spielen hier eine Rolle.

Wosl
 

Wosl

Member
Hallo Klaus,

jo, ich habe es geahnt, dass ich einen dummen Fehler gemacht habe. Mit deiner Korrektur funktionieren jetzt alle Fälle wie erwartet!

Danke
Wosl
 

FrozenGecko_47

New Member
Wenn du die Differenz in Ticks zwischen zwei DateTime-Werten berechnen möchtest, kannst du das in C# oder .NET ganz einfach mit der Ticks-Eigenschaft machen. Ein Tick entspricht 100 Nanosekunden, also 10 Millionen Ticks pro Sekunde.


Hier ein einfaches Beispiel in C#:


csharp
CopyEdit
DateTime start = new DateTime(2024, 01, 01, 12, 0, 0);
DateTime end = new DateTime(2025, 01, 01, 12, 0, 0);
long tickDifference = end.Ticks - start.Ticks;
Console.WriteLine($"Differenz in Ticks: {tickDifference}");


Wenn du nur die Ticks-Differenz zwischen zwei Zeitpunkten brauchst (z. B. für Performance-Messung), kann auch Stopwatch sinnvoller sein. Für allgemeine Datumsvergleiche ist der direkte Zugriff über DateTime.Ticks aber genau richtig.
 
Top