VB6Parse / Library / Datetime / day

VB6 Library Reference

Day Function

Returns a whole number between 1 and 31, inclusive, representing the day of the month.

Syntax

Day(date)

Parameters

Return Value

Returns an Integer representing the day of the month (1-31). Returns Null if the date parameter contains Null.

Remarks

The Day function extracts the day component from a date value. It's one of the primary date component extraction functions in VB6, along with Year, Month, Weekday, Hour, Minute, and Second.

Important Characteristics:

Examples

Basic Usage

' Extract day from date literal
Dim d As Integer
d = Day(#1/15/2025#)  ' Returns 15

' From Date variable
Dim birthday As Date
birthday = #5/23/1990#
d = Day(birthday)  ' Returns 23

' From current date
d = Day(Date)  ' Returns current day

With Date Functions

' Extract day from DateSerial result
Dim constructedDate As Date
constructedDate = DateSerial(2025, 12, 25)
Dim dayNum As Integer
dayNum = Day(constructedDate)  ' Returns 25

' From DateAdd calculation
Dim futureDate As Date
futureDate = DateAdd("d", 10, Date)
dayNum = Day(futureDate)

Date Validation

Function IsLastDayOfMonth(dateValue As Date) As Boolean
Dim nextDay As Date
nextDay = DateAdd("d", 1, dateValue)
IsLastDayOfMonth = (Day(nextDay) = 1)
End Function

' Alternative using month comparison
Function IsLastDayOfMonth2(dateValue As Date) As Boolean
IsLastDayOfMonth2 = (Day(dateValue + 1) = 1)
End Function

Common Patterns

Get Days in Month

Function DaysInMonth(dateValue As Date) As Integer
' Get last day of the month
Dim firstOfNextMonth As Date
firstOfNextMonth = DateSerial(Year(dateValue), Month(dateValue) + 1, 1)
DaysInMonth = Day(firstOfNextMonth - 1)
End Function

' Alternative approach
Function DaysInMonth2(yr As Integer, mo As Integer) As Integer
DaysInMonth2 = Day(DateSerial(yr, mo + 1, 0))
End Function

Extract Date Components

Sub DisplayDateParts(dateValue As Date)
Dim yr As Integer, mo As Integer, dy As Integer

yr = Year(dateValue)
mo = Month(dateValue)
dy = Day(dateValue)

MsgBox "Year: " & yr & ", Month: " & mo & ", Day: " & dy
End Sub

Day-Based Filtering

Function IsFirstHalfOfMonth(dateValue As Date) As Boolean
IsFirstHalfOfMonth = (Day(dateValue) <= 15)
End Function

Function IsSecondHalfOfMonth(dateValue As Date) As Boolean
IsSecondHalfOfMonth = (Day(dateValue) > 15)
End Function

Function IsMonthStart(dateValue As Date) As Boolean
IsMonthStart = (Day(dateValue) = 1)
End Function

Date Comparison by Day

Function SameDayOfMonth(date1 As Date, date2 As Date) As Boolean
SameDayOfMonth = (Day(date1) = Day(date2))
End Function

Function CompareDays(date1 As Date, date2 As Date) As Integer
' Returns: -1 if date1's day < date2's day
'           0 if same day
'           1 if date1's day > date2's day
Dim d1 As Integer, d2 As Integer
d1 = Day(date1)
d2 = Day(date2)

If d1 < d2 Then
CompareDays = -1
ElseIf d1 > d2 Then
CompareDays = 1
Else
CompareDays = 0
End If
End Function

Reconstruct Date with Modified Day

Function ChangeDay(originalDate As Date, newDay As Integer) As Date
' Create new date with same year/month but different day
ChangeDay = DateSerial(Year(originalDate), Month(originalDate), newDay)
End Function

' Move to specific day of current month
Function MoveToDayOfMonth(dayNum As Integer) As Date
MoveToDayOfMonth = DateSerial(Year(Date), Month(Date), dayNum)
End Function

Loop Through Days of Month

Sub ProcessAllDaysInMonth(yr As Integer, mo As Integer)
Dim dayCount As Integer
Dim currentDay As Date
Dim i As Integer

dayCount = Day(DateSerial(yr, mo + 1, 0))

For i = 1 To dayCount
currentDay = DateSerial(yr, mo, i)
Debug.Print "Day " & Day(currentDay) & ": " & Format(currentDay, "dddd")
Next i
End Sub

Pay Period Calculations

Function GetPayPeriod(dateValue As Date) As String
' Bi-monthly pay periods: 1-15 and 16-end
If Day(dateValue) <= 15 Then
GetPayPeriod = "First Half"
Else
GetPayPeriod = "Second Half"
End If
End Function

Function IsPayday(dateValue As Date) As Boolean
Dim dy As Integer
dy = Day(dateValue)
' Payday on 15th and last day of month
IsPayday = (dy = 15) Or (Day(dateValue + 1) = 1)
End Function

Birthday/Anniversary Checks

Function IsBirthdayMonth(birthday As Date) As Boolean
' Check if current month/day matches birthday
IsBirthdayMonth = (Month(Date) = Month(birthday)) And _
(Day(Date) = Day(birthday))
End Function

Function DaysUntilBirthday(birthday As Date) As Integer
Dim thisYearBirthday As Date
thisYearBirthday = DateSerial(Year(Date), Month(birthday), Day(birthday))

If thisYearBirthday < Date Then
' Birthday already passed this year
thisYearBirthday = DateSerial(Year(Date) + 1, Month(birthday), Day(birthday))
End If

DaysUntilBirthday = DateDiff("d", Date, thisYearBirthday)
End Function

Data Grouping by Day

Function GetDayGroup(dateValue As Date) As String
Dim dy As Integer
dy = Day(dateValue)

Select Case dy
Case 1 To 10
GetDayGroup = "Days 1-10"
Case 11 To 20
GetDayGroup = "Days 11-20"
Case Else
GetDayGroup = "Days 21-31"
End Select
End Function

Advanced Usage

Calendar Grid Generator

Sub GenerateMonthCalendar(yr As Integer, mo As Integer)
Dim firstDay As Date
Dim lastDay As Date
Dim currentDate As Date
Dim dayOfWeek As Integer
Dim daysInMonth As Integer

firstDay = DateSerial(yr, mo, 1)
daysInMonth = Day(DateSerial(yr, mo + 1, 0))

' Print header
Debug.Print "Sun Mon Tue Wed Thu Fri Sat"

' Print leading spaces
dayOfWeek = Weekday(firstDay, vbSunday)
Debug.Print String((dayOfWeek - 1) * 4, " ");

' Print days
For i = 1 To daysInMonth
currentDate = DateSerial(yr, mo, i)
Debug.Print Format(Day(currentDate), "000") & " ";

If Weekday(currentDate, vbSunday) = 7 Then
Debug.Print  ' New line
End If
Next i
End Sub

Date Range Iterator

Function GetDateRange(startDate As Date, endDate As Date) As Variant
' Returns array of dates in range
Dim dayCount As Long
Dim dates() As Date
Dim i As Long

dayCount = DateDiff("d", startDate, endDate) + 1
ReDim dates(0 To dayCount - 1)

For i = 0 To dayCount - 1
dates(i) = DateAdd("d", i, startDate)
Debug.Print "Day " & Day(dates(i)) & ": " & dates(i)
Next i

GetDateRange = dates
End Function

Billing Cycle Calculator

Function CalculateBillingDay(startDate As Date, monthsElapsed As Integer) As Date
' Keep same day-of-month for billing cycle
Dim billingDay As Integer
billingDay = Day(startDate)

CalculateBillingDay = DateSerial( _
Year(DateAdd("m", monthsElapsed, startDate)), _
Month(DateAdd("m", monthsElapsed, startDate)), _
billingDay)
End Function

Function AdjustForMonthEnd(targetDate As Date, originalDay As Integer) As Date
' Handle when original day doesn't exist in target month
Dim targetMonth As Date
Dim maxDayInMonth As Integer

targetMonth = DateSerial(Year(targetDate), Month(targetDate), 1)
maxDayInMonth = Day(DateSerial(Year(targetDate), Month(targetDate) + 1, 0))

If originalDay > maxDayInMonth Then
AdjustForMonthEnd = DateSerial(Year(targetDate), Month(targetDate), maxDayInMonth)
Else
AdjustForMonthEnd = DateSerial(Year(targetDate), Month(targetDate), originalDay)
End If
End Function

Date Pattern Analyzer

Function AnalyzeDatePattern(dates() As Date) As String
' Determine if dates follow a pattern
Dim i As Long
Dim allSameDay As Boolean
Dim firstDay As Integer

If UBound(dates) < LBound(dates) Then
AnalyzeDatePattern = "Empty"
Exit Function
End If

firstDay = Day(dates(LBound(dates)))
allSameDay = True

For i = LBound(dates) + 1 To UBound(dates)
If Day(dates(i)) <> firstDay Then
allSameDay = False
Exit For
End If
Next i

If allSameDay Then
AnalyzeDatePattern = "Monthly on day " & firstDay
Else
AnalyzeDatePattern = "Variable days"
End If
End Function

Work Schedule Helper

Function IsWorkDay(dateValue As Date, workDays As String) As Boolean
' workDays: comma-separated list like "1,15,30"
Dim dayList() As String
Dim i As Integer
Dim currentDay As Integer

currentDay = Day(dateValue)
dayList = Split(workDays, ",")

For i = LBound(dayList) To UBound(dayList)
If CInt(Trim(dayList(i))) = currentDay Then
IsWorkDay = True
Exit Function
End If
Next i

IsWorkDay = False
End Function

Leap Year Day Check

Function IsLeapYearDay(dateValue As Date) As Boolean
' Check if date is February 29
IsLeapYearDay = (Month(dateValue) = 2) And (Day(dateValue) = 29)
End Function

Function HasLeapYearDayBetween(startDate As Date, endDate As Date) As Boolean
Dim yr As Integer
Dim leapDay As Date

For yr = Year(startDate) To Year(endDate)
On Error Resume Next
leapDay = DateSerial(yr, 2, 29)
If Err.Number = 0 Then
If leapDay >= startDate And leapDay <= endDate Then
HasLeapYearDayBetween = True
Exit Function
End If
End If
Err.Clear
Next yr

HasLeapYearDayBetween = False
End Function

Database Query Builder

Function BuildDayFilter(targetDay As Integer) As String
' Build SQL WHERE clause for specific day of month
BuildDayFilter = "Day(DateField) = " & targetDay
End Function

Function GetRecordsForDayRange(startDay As Integer, endDay As Integer) As String
GetRecordsForDayRange = "Day(DateField) BETWEEN " & startDay & " AND " & endDay
End Function

Error Handling

Function SafeDay(dateValue As Variant) As Variant
On Error GoTo ErrorHandler

If IsNull(dateValue) Then
SafeDay = Null
Exit Function
End If

If Not IsDate(dateValue) Then
SafeDay = Null
Exit Function
End If

SafeDay = Day(dateValue)
Exit Function

ErrorHandler:
SafeDay = Null
End Function

Common Errors

Performance Considerations

Best Practices

Use for Component Extraction

' Good - Direct component access
dayNum = Day(someDate)

' Avoid - String manipulation overhead
dayNum = CInt(Format(someDate, "dd"))

Validate Date Before Extraction

' Good - Check for valid date
If IsDate(userInput) Then
dayNum = Day(CDate(userInput))
End If

' Avoid - May cause type mismatch error
dayNum = Day(userInput)

Handle Null Values in Variants

' Good - Check for Null
If Not IsNull(dateVariant) Then
dayNum = Day(dateVariant)
End If

' Avoid - May propagate Null unexpectedly
dayNum = Day(dateVariant)

Combine with DateSerial for Date Manipulation

' Good - Reconstruct date with modified component
newDate = DateSerial(Year(oldDate), Month(oldDate), 15)

' Good - Get last day of month
lastDay = Day(DateSerial(yr, mo + 1, 0))

Comparison with Other Functions

Day vs Format

' Day - Returns integer, fast
dayNum = Day(someDate)  ' Returns 15

' Format - Returns string, slower, more flexible
dayStr = Format(someDate, "dd")  ' Returns "15"
dayStr = Format(someDate, "d")   ' Returns "15" (no leading zero)

Day vs DatePart

' Day - Specific function for day of month
dayNum = Day(someDate)

' DatePart - Generic function, can extract any part
dayNum = DatePart("d", someDate)  ' Same result

Day vs Weekday

' Day - Day of month (1-31)
dayOfMonth = Day(#1/15/2025#)  ' Returns 15

' Weekday - Day of week (1-7)
dayOfWeek = Weekday(#1/15/2025#)  ' Returns 4 (Wednesday)

Limitations

← Back to Datetime | View all functions