Second Function
Returns an Integer specifying a whole number between 0 and 59, inclusive, representing the second of the minute.
Syntax
Second(time)
Parameters
time- Required. Any Variant, numeric expression, string expression, or any combination that can represent a time. Iftimecontains Null, Null is returned.
Return Value
Returns an Integer between 0 and 59 representing the second of the minute.
Remarks
The Second function extracts the seconds component from a time value. It is commonly used for time parsing, logging, and time-based calculations.
Important Notes: - Returns 0-59 (60 seconds in a minute) - If time contains Null, Second returns Null - If time is not a valid time, runtime error occurs (Error 13: Type mismatch) - Only the time portion is used; date portion is ignored - Accepts Date/Time values, numeric values, and valid time strings
Valid Input Examples: - Date/Time values: Now, Time, Date - Time strings: "3:45:30 PM", "15:45:30" - Numeric values representing dates: 0.5 (noon), 0.75 (6 PM) - Combined date/time: #1/1/2000 3:45:30 PM#
Typical Uses
- Time Parsing: Extract seconds from time values
- Logging: Record precise timestamps
- Time Calculations: Compute time differences
- Scheduling: Check if task should run at specific second
- Animation: Time-based animations at second intervals
- Performance Timing: Measure elapsed seconds
- Data Validation: Verify time components
- Report Generation: Format time displays
Basic Examples
Example 1: Get Current Second
Dim currentSecond As Integer
currentSecond = Second(Now) ' Returns 0-59
Example 2: Parse Time String
Dim timeStr As String
Dim sec As Integer
timeStr = "3:45:30 PM"
sec = Second(timeStr) ' Returns 30
Example 3: Check Specific Second
If Second(Now) = 0 Then
MsgBox "New minute started!"
End If
Example 4: Extract from Date/Time
Dim dt As Date
Dim seconds As Integer
dt = #1/15/2000 10:30:45 AM#
seconds = Second(dt) ' Returns 45
Common Patterns
Pattern 1: GetTimeSeconds
Function GetTimeSeconds(timeValue As Variant) As Integer
' Safely get seconds from time value
On Error Resume Next
GetTimeSeconds = Second(timeValue)
If Err.Number <> 0 Then
GetTimeSeconds = 0
End If
On Error GoTo 0
End Function
Pattern 2: FormatTimeWithSeconds
Function FormatTimeWithSeconds(timeValue As Date) As String
' Format time as HH:MM:SS
Dim h As Integer, m As Integer, s As Integer
h = Hour(timeValue)
m = Minute(timeValue)
s = Second(timeValue)
FormatTimeWithSeconds = Format(h, "00") & ":" & _
Format(m, "00") & ":" & _
Format(s, "00")
End Function
Pattern 3: IsAtSecondInterval
Function IsAtSecondInterval(timeValue As Date, interval As Integer) As Boolean
' Check if time is at a specific second interval
' e.g., IsAtSecondInterval(Now, 15) returns True at :00, :15, :30, :45
IsAtSecondInterval = (Second(timeValue) Mod interval = 0)
End Function
Pattern 4: GetElapsedSeconds
Function GetElapsedSeconds(startTime As Date, endTime As Date) As Long
' Get total elapsed seconds between two times
GetElapsedSeconds = DateDiff("s", startTime, endTime)
End Function
Pattern 5: SetSeconds
Function SetSeconds(timeValue As Date, newSeconds As Integer) As Date
' Set the seconds component of a time value
Dim h As Integer, m As Integer
h = Hour(timeValue)
m = Minute(timeValue)
SetSeconds = TimeSerial(h, m, newSeconds)
End Function
Pattern 6: RoundToNearestMinute
Function RoundToNearestMinute(timeValue As Date) As Date
' Round time to nearest minute based on seconds
Dim h As Integer, m As Integer, s As Integer
h = Hour(timeValue)
m = Minute(timeValue)
s = Second(timeValue)
If s >= 30 Then
m = m + 1
If m = 60 Then
m = 0
h = h + 1
If h = 24 Then h = 0
End If
End If
RoundToNearestMinute = TimeSerial(h, m, 0)
End Function
Pattern 7: CompareTimeToSecond
Function CompareTimeToSecond(time1 As Date, time2 As Date) As Boolean
' Compare times to the second (ignore milliseconds)
Dim h1 As Integer, m1 As Integer, s1 As Integer
Dim h2 As Integer, m2 As Integer, s2 As Integer
h1 = Hour(time1): m1 = Minute(time1): s1 = Second(time1)
h2 = Hour(time2): m2 = Minute(time2): s2 = Second(time2)
CompareTimeToSecond = (h1 = h2 And m1 = m2 And s1 = s2)
End Function
Pattern 8: ValidateTimeSeconds
Function ValidateTimeSeconds(timeValue As Variant) As Boolean
' Validate that seconds are in valid range
On Error Resume Next
Dim s As Integer
s = Second(timeValue)
If Err.Number <> 0 Then
ValidateTimeSeconds = False
Else
ValidateTimeSeconds = (s >= 0 And s <= 59)
End If
On Error GoTo 0
End Function
Pattern 9: GetSecondsUntilMinute
Function GetSecondsUntilMinute(Optional timeValue As Date) As Integer
' Get seconds remaining until next minute
Dim currentTime As Date
If timeValue = 0 Then
currentTime = Now
Else
currentTime = timeValue
End If
GetSecondsUntilMinute = 60 - Second(currentTime)
End Function
Pattern 10: ParseTimeComponents
Sub ParseTimeComponents(timeValue As Date, hours As Integer, _
minutes As Integer, seconds As Integer)
' Parse time into separate components
hours = Hour(timeValue)
minutes = Minute(timeValue)
seconds = Second(timeValue)
End Sub
Advanced Usage
Example 1: Precise Timer Class
' High-precision timer for performance measurement
Class PreciseTimer
Private m_startTime As Date
Private m_running As Boolean
Public Sub Start()
m_startTime = Now
m_running = True
End Sub
Public Sub Stop()
m_running = False
End Sub
Public Function GetElapsedSeconds() As Long
' Get elapsed seconds
Dim endTime As Date
If m_running Then
endTime = Now
Else
endTime = m_startTime
End If
GetElapsedSeconds = DateDiff("s", m_startTime, endTime)
End Function
Public Function GetElapsedTime() As String
' Get formatted elapsed time
Dim elapsed As Long
Dim hours As Long, minutes As Long, seconds As Long
elapsed = GetElapsedSeconds()
hours = elapsed \ 3600
minutes = (elapsed Mod 3600) \ 60
seconds = elapsed Mod 60
GetElapsedTime = Format(hours, "00") & ":" & _
Format(minutes, "00") & ":" & _
Format(seconds, "00")
End Function
Public Function GetCurrentSecond() As Integer
' Get current second of running timer
If m_running Then
GetCurrentSecond = Second(Now)
Else
GetCurrentSecond = Second(m_startTime)
End If
End Function
Public Sub Reset()
m_startTime = Now
m_running = False
End Sub
Public Function IsRunning() As Boolean
IsRunning = m_running
End Function
End Class
Example 2: Time Logger Module
' Log events with precise timestamps
Module TimeLogger
Private Type LogEntry
Timestamp As Date
Message As String
Second As Integer
End Type
Private m_logEntries() As LogEntry
Private m_count As Integer
Public Sub InitializeLog()
m_count = 0
ReDim m_logEntries(0 To 999)
End Sub
Public Sub LogEvent(message As String, Optional timeValue As Date)
Dim entry As LogEntry
Dim logTime As Date
If m_count > UBound(m_logEntries) Then
ReDim Preserve m_logEntries(0 To UBound(m_logEntries) + 1000)
End If
If timeValue = 0 Then
logTime = Now
Else
logTime = timeValue
End If
entry.Timestamp = logTime
entry.Message = message
entry.Second = Second(logTime)
m_logEntries(m_count) = entry
m_count = m_count + 1
End Sub
Public Function GetFormattedLog() As String
' Get formatted log with timestamps
Dim i As Integer
Dim result As String
Dim timeStr As String
result = "Event Log" & vbCrLf
result = result & String(50, "-") & vbCrLf
For i = 0 To m_count - 1
timeStr = Format(m_logEntries(i).Timestamp, "yyyy-mm-dd hh:nn:ss")
result = result & timeStr & " | " & m_logEntries(i).Message & vbCrLf
Next i
GetFormattedLog = result
End Function
Public Function GetEventsAtSecond(targetSecond As Integer) As String
' Get all events that occurred at a specific second
Dim i As Integer
Dim result As String
Dim count As Integer
result = "Events at second " & targetSecond & ":" & vbCrLf
count = 0
For i = 0 To m_count - 1
If m_logEntries(i).Second = targetSecond Then
result = result & " " & _
Format(m_logEntries(i).Timestamp, "hh:nn:ss") & " | " & _
m_logEntries(i).Message & vbCrLf
count = count + 1
End If
Next i
result = result & vbCrLf & "Total: " & count & " events"
GetEventsAtSecond = result
End Function
Public Function GetLogCount() As Integer
GetLogCount = m_count
End Function
Public Sub ClearLog()
m_count = 0
ReDim m_logEntries(0 To 999)
End Sub
End Module
Example 3: Time-Based Task Scheduler
' Schedule tasks to run at specific seconds
Class TaskScheduler
Private Type ScheduledTask
TaskName As String
TargetSecond As Integer
Interval As Integer
LastRun As Date
Enabled As Boolean
End Type
Private m_tasks() As ScheduledTask
Private m_count As Integer
Public Sub Initialize()
m_count = 0
ReDim m_tasks(0 To 99)
End Sub
Public Sub AddTask(taskName As String, targetSecond As Integer, _
Optional interval As Integer = 60)
' Add task to run at specific second
If m_count > UBound(m_tasks) Then
ReDim Preserve m_tasks(0 To UBound(m_tasks) + 50)
End If
m_tasks(m_count).TaskName = taskName
m_tasks(m_count).TargetSecond = targetSecond
m_tasks(m_count).Interval = interval
m_tasks(m_count).LastRun = 0
m_tasks(m_count).Enabled = True
m_count = m_count + 1
End Sub
Public Function CheckTasks() As String
' Check which tasks should run now
Dim currentTime As Date
Dim currentSecond As Integer
Dim i As Integer
Dim tasksToRun As String
Dim elapsedSeconds As Long
currentTime = Now
currentSecond = Second(currentTime)
tasksToRun = ""
For i = 0 To m_count - 1
If m_tasks(i).Enabled Then
If currentSecond = m_tasks(i).TargetSecond Then
If m_tasks(i).LastRun = 0 Then
' First run
tasksToRun = tasksToRun & m_tasks(i).TaskName & ";"
m_tasks(i).LastRun = currentTime
Else
' Check interval
elapsedSeconds = DateDiff("s", m_tasks(i).LastRun, currentTime)
If elapsedSeconds >= m_tasks(i).Interval Then
tasksToRun = tasksToRun & m_tasks(i).TaskName & ";"
m_tasks(i).LastRun = currentTime
End If
End If
End If
End If
Next i
CheckTasks = tasksToRun
End Function
Public Sub EnableTask(taskName As String)
Dim i As Integer
For i = 0 To m_count - 1
If m_tasks(i).TaskName = taskName Then
m_tasks(i).Enabled = True
Exit Sub
End If
Next i
End Sub
Public Sub DisableTask(taskName As String)
Dim i As Integer
For i = 0 To m_count - 1
If m_tasks(i).TaskName = taskName Then
m_tasks(i).Enabled = False
Exit Sub
End If
Next i
End Sub
End Class
Example 4: Animation Timer
' Time-based animation controller using seconds
Class AnimationTimer
Private m_startTime As Date
Private m_duration As Integer ' Duration in seconds
Private m_running As Boolean
Public Sub StartAnimation(durationSeconds As Integer)
m_startTime = Now
m_duration = durationSeconds
m_running = True
End Sub
Public Function GetProgress() As Double
' Get animation progress (0.0 to 1.0)
Dim elapsed As Long
If Not m_running Then
GetProgress = 0
Exit Function
End If
elapsed = DateDiff("s", m_startTime, Now)
If elapsed >= m_duration Then
GetProgress = 1
m_running = False
Else
GetProgress = elapsed / m_duration
End If
End Function
Public Function GetElapsedSeconds() As Integer
' Get elapsed seconds since animation start
If m_running Then
GetElapsedSeconds = DateDiff("s", m_startTime, Now)
Else
GetElapsedSeconds = 0
End If
End Function
Public Function GetRemainingSeconds() As Integer
' Get remaining seconds in animation
Dim elapsed As Integer
If Not m_running Then
GetRemainingSeconds = 0
Exit Function
End If
elapsed = DateDiff("s", m_startTime, Now)
If elapsed >= m_duration Then
GetRemainingSeconds = 0
m_running = False
Else
GetRemainingSeconds = m_duration - elapsed
End If
End Function
Public Function IsComplete() As Boolean
IsComplete = Not m_running
End Function
Public Sub Stop()
m_running = False
End Sub
Public Function GetCurrentSecond() As Integer
GetCurrentSecond = Second(Now)
End Function
End Class
Error Handling
The Second function generates errors in specific situations:
Error 13: Type mismatch - Occurs when the argument cannot be interpreted as a date/time value
Error 94: Invalid use of Null - Can occur if Null is passed and not handled properly
Example error handling:
On Error Resume Next
Dim sec As Integer
sec = Second(userInput)
If Err.Number <> 0 Then
MsgBox "Invalid time value"
sec = 0
End If
On Error GoTo 0
Performance Considerations
Secondis very fast - simple extraction operation- No significant performance considerations
- Can be called thousands of times with minimal impact
- Consider caching if calling repeatedly on same value
Best Practices
- Validate Input: Check that input is valid date/time before calling
- Handle Null: Check for Null if data source is uncertain
- Use with Other Time Functions: Combine with Hour, Minute for complete parsing
- Format Consistently: Use consistent time formatting in your application
- Consider Time Zones: Be aware of time zone issues in time calculations
- Document Precision: Clarify if milliseconds matter in your application
- Use for Validation: Validate time components are in expected ranges
- Cache Now Values: If using Now multiple times, cache to avoid timing issues
- Test Edge Cases: Test with midnight, end of minute, etc.
- Use
TimeSerial: Combine withTimeSerialto construct times
Comparison with Related Functions
| Function | Purpose | Returns | Range |
|---|---|---|---|
| Second | Get seconds | Integer | 0-59 |
| Minute | Get minutes | Integer | 0-59 |
| Hour | Get hours | Integer | 0-23 |
| Day | Get day | Integer | 1-31 |
| Month | Get month | Integer | 1-12 |
| Year | Get year | Integer | 100-9999 |
TimeSerial |
Create time | Date | Constructs time from H:M:S |
DatePart |
Get date part | Variant | Flexible date/time extraction |
Platform and Version Notes
- Available in all versions of VB6 and VBA
- Behavior consistent across all platforms
- In VB.NET, replaced by DateTime.Second property
- Returns Integer type (not Long)
- Always returns 0-59 range
Limitations
- No millisecond precision
- Cannot distinguish leap seconds
- Range limited to 0-59 (no support for values outside this range)
- Date portion of Date/Time value is ignored
- Cannot be used as
LValue(cannot assign to Second)
Related Functions
Minute: Returns the minute of the hour (0-59)Hour: Returns the hour of the day (0-23)Now: Returns the current system date and timeTime: Returns the current system timeTimeSerial: Returns a Date value for a specific timeDatePart: Returns a specified part of a given dateTimer: Returns seconds since midnight as Single