When you think ASP, think...
Recent Articles
All Articles
ASP.NET Articles
ASPFAQs.com
Message Board
Related Web Technologies
User Tips!
Coding Tips

Sections:
Sample Chapters
Commonly Asked Message Board Questions
JavaScript Tutorials
MSDN Communities Hub
Official Docs
Security
Stump the SQL Guru!
XML Info
Information:
Feedback
Author an Article
ASP ASP.NET ASP FAQs Message Board Feedback
Print this page.
Published: Tuesday, February 27, 2001

A Customizable Date Formatting Routine

By Ken Schaefer


A Note from the Web Master
This code snippet is an update to the code presented in a previous 4Guys article: Dan's Customizable Date Formatting Procedure.

- continued -

I've been looking more closely at the DanDate() function that's available at Dan's Customizable Date Formatting Procedure. I don't want to take anything anyway from the idea, which is great, but that said there's a couple of little problems:

  • The escaping of %% doesn't work, it's at the end, not the beginning, so it's a bit pointless.
  • The optional ordinal function has a logical error - it only appends "nd", not "rd" (so 23 ends up being 23nd, not 23rd, and the same with 3).

I rewrote the function, with Replace() instead of Do While...Loops (not sure which is faster, but mine has less lines of code), and included an "optional minutes" option, where the minutes are only written out if they are not equal to 0 (e.g. you could write out "12 PM to 1:30 PM"), and rearranged the strFormat template strings to be inline with the strings used in DatePart (e.g. all minutes are referred to by either %N or %n, not %M)

At the end of this document you will find the code for my updated customizable date formatting procedure. There is also a live demo for you to play with, trying out different date customization strings and noting the output.

Happy Programming!

By Ken Schaefer


Attachments:

  • View the live demo!


    <%
    Function fncGetDayOrdinal( _
     byVal intDay _
     )
     ' Accepts a day of the month as an integer and returns the
     ' appropriate suffix
    
     Dim strOrd
    
     Select Case intDay
     Case 1, 21, 31
      strOrd = "st"
     Case 2, 22
      strOrd = "nd"
     Case 3, 23
      strOrd = "rd"
     Case Else
      strOrd = "th"
     End Select
    
     fncGetDayOrdinal = strOrd
    End Function ' fncGetDayOrdinal
    
    
    
    Function fncFmtDate( _
        byVal strDate, _
        byRef strFormat _
       )
     ' Accepts strDate as a valid date/time,
     ' strFormat as the output template.
     ' The function finds each item in the
     ' template and replaces it with the
     ' relevant information extracted from strDate
    
     ' Template items (example)
     ' %m Month as a decimal (02)
     ' %B Full month name (February)
     ' %b Abbreviated month name (Feb )
     ' %d Day of the month (23)
     ' %O Ordinal of day of month (eg st or rd or nd)
     ' %j Day of the year (54)
     ' %Y Year with century (1998)
     ' %y Year without century (98)
     ' %w Weekday as integer (0 is Sunday)
     ' %a Abbreviated day name (Fri)
     ' %A Weekday Name (Friday)
     ' %H Hour in 24 hour format (24)
     ' %h Hour in 12 hour format (12)
     ' %N Minute as an integer (01)
     ' %n Minute as optional if minute <> 0
     ' %S Second as an integer (55)
     ' %P AM/PM Indicator (PM)
    
     On Error Resume Next
    
     Dim intPosItem
     Dim int12HourPart
     Dim str24HourPart
     Dim strMinutePart
     Dim strSecondPart
     Dim strAMPM
    
     ' Insert Month Numbers
     strFormat = Replace(strFormat, "%m", _
              DatePart("m", strDate), 1, -1, vbBinaryCompare)
    
     ' Insert non-Abbreviated Month Names
     strFormat = Replace(strFormat, "%B", _
              MonthName(DatePart("m", strDate), _
              False), 1, -1, vbBinaryCompare)
    
     ' Insert Abbreviated Month Names
     strFormat = Replace(strFormat, "%b", _
              MonthName(DatePart("m", strDate), _
              True), 1, -1, vbBinaryCompare)
    
     ' Insert Day Of Month
     strFormat = Replace(strFormat, "%d", _
              DatePart("d",strDate), 1, _
              -1, vbBinaryCompare)
    
     ' Insert Day of Month Ordinal (eg st, th, or rd)
     strFormat = Replace(strFormat, "%O", _
              fncGetDayOrdinal(Day(strDate)), _
              1, -1, vbBinaryCompare)
    
     ' Insert Day of Year
     strFormat = Replace(strFormat, "%j", _
              DatePart("y",strDate), 1, _
              -1, vbBinaryCompare)
    
     ' Insert Long Year (4 digit)
     strFormat = Replace(strFormat, "%Y", _
              DatePart("yyyy",strDate), 1, _
              -1, vbBinaryCompare)
    
     ' Insert Short Year (2 digit)
     strFormat = Replace(strFormat, "%y", _
              Right(DatePart("yyyy",strDate),2), _
              1, -1, vbBinaryCompare)
    
     ' Insert Weekday as Integer (eg 0 = Sunday)
     strFormat = Replace(strFormat, "%w", _
              DatePart("w",strDate,1), 1, _
              -1, vbBinaryCompare)
    
     ' Insert Abbreviated Weekday Name (eg Sun)
     strFormat = Replace(strFormat, "%a", _
              WeekDayName(DatePart("w",strDate,1),True), 1, _
              -1, vbBinaryCompare)
    
     ' Insert non-Abbreviated Weekday Name
     strFormat = Replace(strFormat, "%A", _
              WeekDayName(DatePart("w",strDate,1),False), 1, _
              -1, vbBinaryCompare)
    
     ' Insert Hour in 24hr format
     str24HourPart = DatePart("h",strDate)
     If Len(str24HourPart) < 2 then str24HourPart = "0" & _
                                                     str24HourPart
     strFormat = Replace(strFormat, "%H", str24HourPart, 1, _
              -1, vbBinaryCompare)
    
     ' Insert Hour in 12hr format
     int12HourPart = DatePart("h",strDate) Mod 12
     If int12HourPart = 0 then int12HourPart = 12
     strFormat = Replace(strFormat, "%h", int12HourPart, 1, _
              -1, vbBinaryCompare)
    
     ' Insert Minutes
     strMinutePart = DatePart("n",strDate)
     If Len(strMinutePart) < 2 then _
              strMinutePart = "0" & strMinutePart
     strFormat = Replace(strFormat, "%N", strMinutePart, _
              1, -1, vbBinaryCompare)
    
     ' Insert Optional Minutes
     If CInt(strMinutePart) = 0 then
      strFormat = Replace(strFormat, "%n", "", 1, _
               -1, vbBinaryCompare)
     Else
      If CInt(strMinutePart) < 10 then _
               strMinutePart = "0" & strMinutePart
      strMinutePart = ":" & strMinutePart
      strFormat = Replace(strFormat, "%n", strMinutePart, _
               1, -1, vbBinaryCompare)
     End if
    
     ' Insert Seconds
     strSecondPart = DatePart("s",strDate)
     If Len(strSecondPart) < 2 then _
              strSecondPart = "0" & strSecondPart
     strFormat = Replace(strFormat, "%S", strSecondPart, 1, _
              -1, vbBinaryCompare)
    
     ' Insert AM/PM indicator
     If DatePart("h",strDate) >= 12 then
       strAMPM = "PM"
     Else
       strAMPM = "AM"
     End If
    
     strFormat = Replace(strFormat, "%P", strAMPM, 1, _
              -1, vbBinaryCompare)
    
     fncFmtDate = strFormat
    
     'If there is an error output its value
     If err.Number <> 0 then
      Response.Clear
      Response.Write "ERROR " & err.Number & _
                     ": fmcFmtDate - " & err.Description
      Response.Flush
      Response.End
     End if
    End Function ' fncFmtDate
    %>
    


  • ASP.NET [1.x] [2.0] | ASPMessageboard.com | ASPFAQs.com | Advertise | Feedback | Author an Article