vb Code:
Public Const NullDate As Date = #12:00:00 AM#
Public Function TimeSince(pdtmDate As Date) As String
Dim lngYears As Long
Dim lngMonths As Long
Dim lngWeeks As Long
Dim lngDays As Long
Dim lngHours As Long
Dim lngMinutes As Long
Dim lngSeconds As Long
If pdtmDate = NullDate Then
TimeSince = "Never"
Exit Function
End If
lngSeconds = DateDiff("s", pdtmDate, Now())
If lngSeconds <= 60 Then ' Seconds
TimeSince = Plural(lngSeconds, "second")
ElseIf Reduce(lngMinutes, lngSeconds, 60) <= 60 Then ' Minutes, Seconds
TimeSince = Plural(lngMinutes, "minute") & ", " & Plural(lngSeconds, "second") & " ago"
ElseIf Reduce(lngHours, lngMinutes, 60) <= 24 Then ' Hours, Minutes
TimeSince = Plural(lngHours, "hour") & ", " & Plural(lngMinutes, "minute") & " ago"
ElseIf Reduce(lngDays, lngHours, 24) <= 7 Then ' Days, Hours
TimeSince = Plural(lngDays, "day") & ", " & Plural(lngHours, "hour") & " ago"
ElseIf pdtmDate >= DateAdd("d", -56, Now()) Then ' Weeks, Days
Reduce lngWeeks, lngDays, 7
TimeSince = Plural(lngWeeks, "week") & ", " & Plural(lngDays, "day") & " ago"
Else
lngMonths = DateDiff("m", pdtmDate, Now())
If Day(pdtmDate) > Day(Now()) Then lngMonths = lngMonths - 1
If lngMonths <= 12 Then ' Months, Weeks
lngWeeks = DateDiff("d", pdtmDate, DateAdd("m", -lngMonths, Now())) \ 7
TimeSince = Plural(lngMonths, "month") & ", " & Plural(lngWeeks, "week") & " ago"
ElseIf Reduce(lngYears, lngMonths, 12) < 10 Then ' Years, Months
TimeSince = Plural(lngYears, "year") & ", " & Plural(lngMonths, "month") & " ago"
Else ' Years
TimeSince = Plural(lngYears, "year") & " ago"
End If
End If
End Function
Private Function Reduce(plngLarge As Long, plngSmall As Long, plngFactor As Long) As Long
plngLarge = plngSmall \ plngFactor
plngSmall = plngSmall Mod plngFactor
Reduce = plngLarge
End Function
Private Function Plural(plngNumber As Long, pstrSingular As String, Optional pstrPlural As String = "s") As String
If plngNumber = 1 Then Plural = "1 " & pstrSingular Else Plural = plngNumber & " " & pstrSingular & pstrPlural
End Function