Home > other >  Calculate difference in month and years between two date in vb.net
Calculate difference in month and years between two date in vb.net

Time:08-18

i have a question for you, my first one. Im trying to calculate the difference in years and months between 2 dates using vb.net. I'm just started working with vb and im new to programming, so i might sound really dumb. This is my expected output:

date1 1/6/2015 date2 1/1/2019 3 years 7 months and so on.

if date2 is < than data1 then the program should return a negative value in months/years. day number are irrelevant, i just want to know how many months/years.

This is the code that i found and it works if data1 is > than data2 but doesn't if data2 is > than data1.

        Dim data1 As DateTime = ("1/3/2021") # working examples
        Dim data2 As DateTime = ("1/5/2022")
 
Public Shared Function GetDateSpanText(fromDate As DateTime, toDate As DateTime) As String
        Dim years As Integer = 0, months As Integer = 0, days As Integer = 0

        Do Until toDate.AddYears(-1) < fromDate
            years  = 1
            toDate = toDate.AddYears(-1)
        Loop

        Do Until toDate.AddMonths(-1) < fromDate
            months  = 1
            toDate = toDate.AddMonths(-1)
        Loop

        Do Until toDate.AddDays(-1) < fromDate
            days  = 1
            toDate = toDate.AddDays(-1)
        Loop

        Return String.Format("{0} Year(s) {1} Month(s) {2} Day(s)", years, months, days)
    End Function

how can i make it work the other way? there are functions that can do this?

thanks to everyone

CodePudding user response:

The simplest way to deal with dates and time intervals is using the TimeSpan struct.

Take a look at this snippet:

Sub Test()
    Dim startDate As New Date(2022, 8, 17)
    Dim endDate As New Date(2023, 10, 15)
    Dim timeBetween As TimeSpan = endDate - startDate ' TimeSpan objects represents a time interval
    Dim yearsBetween As Double = timeBetween.TotalDays / 365
    Dim monthsBetween As Double = yearsBetween * 12
    ' Try using simplified string interpolation, like this:
    Console.WriteLine($"Years between: {yearsBetween}; months between: {monthsBetween}") ' Note the $ sign at string beginning
End Sub

Using TimeSpan is conveninent because it gives you access to wathever time fraction you want to use:

timeBetween.TotalDays ' Represents the whole time interval in days (double)
timeBetween.TotalHours ' Represent the whole time interval in hours (double)
timeBetween.Days ' Represents the days part only (integer)

As you may guess, you need to substract the oldest date from the newest date to get a positive TimeSpan.

Note: the TimeSpan struct can not provide you .TotalMonths or .TotalYears methods because months and years are not always of the same length (months can vary between 28 and 31 days and years can be 365 or 366 days). That's why you need to do the calculation yourself like in the code I posted.

CodePudding user response:

This is a perfect example of why you need to think logic first and code second. You already have all the code you need. All you have to do is check the relative order of the dates and switch them before the calculation if necessary, then negate the numbers at the end if you switched them. All the rest of the code is exactly the same. If you'd thought about the logic first then you wouldn't have had to ask the question at all.

Public Shared Function GetDateSpanText(fromDate As DateTime, toDate As DateTime) As String
    Dim swapped = False

    If fromDate > toDate Then
        Dim temp = fromDate

        fromDate = toDate
        toDate = temp

        swapped = True
    End If

    Dim years As Integer = 0, months As Integer = 0, days As Integer = 0

    Do Until toDate.AddYears(-1) < fromDate
        years  = 1
        toDate = toDate.AddYears(-1)
    Loop

    Do Until toDate.AddMonths(-1) < fromDate
        months  = 1
        toDate = toDate.AddMonths(-1)
    Loop

    Do Until toDate.AddDays(-1) < fromDate
        days  = 1
        toDate = toDate.AddDays(-1)
    Loop

    If swapped Then
        years = -years
        months = -months
        days = -days
    End If

    Return String.Format("{0} Year(s) {1} Month(s) {2} Day(s)", years, months, days)
End Function
  • Related