Code – Get date range as years, months and days

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 Post Has One Comment

Leave a Reply