There is a question in the IBM DeveloperWorks forum for Notes/Domino 8 about how to calculate the number of years, months and days between two dates. Then the poster wanted to calculate the sum of two such date ranges and return that as years, months and days as well.
Since the lack of formatting in the forum makes it hard to read the code, I decided to simply post it here on my blog. As always, there are several ways to write the code. One could for example use Mod (a very under-used function that many developers don’t even know about) to help calculate the number of years, months and days.
I also include a function I use to calculate the number of business days between two dates. This could be used to calculate how long a ticket has been open in a help desk system, where you usually don’t want to include Saturday and Sunday in the count.
Simply change diffOne = Days(startDate,endDate) to diffOne = BusinessDays(startDate,endDate).
Enjoy!
Option Public Option Declare Type Components yearCount As Integer monthCount As Integer dayCount As Integer End Type Sub Initialize '*** Declare variable for componentized date Dim compOne As Components Dim compTwo As Components Dim compSum As Components '*** Declare variables for day difference count Dim diffOne As Integer Dim diffTwo As Integer '*** Declare start and end date variables Dim startDate As String Dim endDate As String '*** First date range startDate = "01/01/2011" endDate = "03/02/2013" diffOne = Days(startDate,endDate) Call DayCountToComponents(diffOne, compOne) MsgBox compOne.yearCount & " years " & _ compOne.monthCount & " months " & compOne.dayCount & " days" '*** Second date range startDate = "04/03/2012" endDate = "08/17/2015" diffTwo = Days(startDate,endDate) Call DayCountToComponents(diffTwo, compTwo) MsgBox compTwo.yearCount & " years " & _ compTwo.monthCount & " months " & compTwo.dayCount & " days" '*** Sum of first and second date range Call DayCountToComponents(diffOne + diffTwo, compSum) MsgBox compSum.yearCount & " years " & _ compSum.monthCount & " months " & compSum.dayCount & " days" End Sub %REM Function DayCountToComponents Description: Convert day count to years, month and days %END REM Function DayCountToComponents(dayCount As Integer,components As Components) As Boolean Dim daysLeft As Integer On Error GoTo errHandler components.yearCount = Int(dayCount/365) daysLeft = dayCount - components.yearCount * 365 components.monthCount = Int(daysLeft/30) daysLeft = dayCount - (components.yearCount * 365) - (components.monthCount * 30) components.dayCount = daysLeft '*** Return DayCountToComponents = True exitFunction: Exit Function errHandler: DayCountToComponents = True Resume exitFunction End Function %REM Function Days Description: Get the number of days between two dates %END REM Function Days(startDate As Variant,endDate As Variant) As Integer Days = Int(CDbl(CDat(endDate))-CDbl(CDat(startDate))) End Function %REM Function BusinessDays Description: Get the number of business days (Monday-Friday) between two dates %END REM Function BusinessDays(startDate As Variant,endDate As Variant) As Integer Dim startDT As NotesDateTime Dim endDT As NotesDateTime Dim cnt As Integer On Error GoTo errHandler Set startDT = New NotesDateTime(startDate) Set endDT = New NotesDateTime(endDate) cnt = 0 Do Until CDbl(startDT.Lslocaltime) > CDbl(endDT.Lslocaltime) If Weekday(startDT.Lslocaltime)<7 Then If Weekday(startDT.Lslocaltime)>1 Then cnt = cnt + 1 End If End If Call startDT.Adjustday(1, True) Loop BusinessDays = cnt exitFunction: Exit Function errHandler: BusinessDays = 0 Resume exitFunction End Function
This is splendid! Thanks for sharing.