Formatting Dates in Classic ASP

During my internship at RPM, we used classic ASP for server side scripting rather than the PHP I’m more used to.  Classic ASP is missing functions for formatting dates, like PHP and *NIX shell have, for instance.  SQL Server has the CONVERT function, but only has a limited number of output formats, at least for the older SQL Server version we had:  Otherwise, it would be more efficient to format the data as it is coming from the database .  I built two functions for date formatting based on the PHP and *NIX “date” formats for use on the HSGA site, where I had to format dates a certain way for a project.  I don’t remember if I used it on other projects, but I think so.

Both functions take two parameters.  The first is a date, as would come from a SQL Server “datetime” field.  The second is a string that defines the output format.  The first function uses a format string like the php date function.  The long function is as follows (tabs are double spaces due to the width and length of the content):

Function PHPFormatDateTime(strDateTime, strFormatString)
  Dim intI, strOutput, strTemp, bolEscape
  bolEscape = 0
  
  For intI = 1 to Len(strFormatString)
    If bolEscape = 0 then
      Select Case Mid(strFormatString, intI, 1)
        ' day
        Case "d"
          If DatePart("d", strDateTime) < 10 Then
            strOutput = strOutput & "0" & DatePart("d", strDateTime)  
          Else
            strOutput = strOutput & DatePart("d", strDateTime)
          End If
        Case "j"
          strOutput = strOutput & DatePart("d", strDateTime)
        Case "D"
          Select Case DatePart("w", strDateTime)
            Case 1
              strOutput = strOutput &  "Mon"
            Case 2
              strOutput = strOutput &  "Tue"
            Case 3
              strOutput = strOutput &  "Wed"
            Case 4
              strOutput = strOutput &  "Thu"
            Case 5
              strOutput = strOutput &  "Fri"
            Case 6
              strOutput = strOutput &  "Sat"
            Case 7
              strOutput = strOutput &  "Sun"
          End Select
        Case "l"
          Select Case DatePart("w", strDateTime)
            Case 1
              strOutput = strOutput &  "Monday"
            Case 2
              strOutput = strOutput &  "Tuesday"
            Case 3
              strOutput = strOutput &  "Wednesday"
            Case 4
              strOutput = strOutput &  "Thursday"
            Case 5
              strOutput = strOutput &  "Friday"
            Case 6
              strOutput = strOutput &  "Saturday"
            Case 7
              strOutput = strOutput &  "Sunday"
          End Select
        Case "S"
          strTemp = DatePart("d", strDateTime)
          If strTemp < 10 Then
            strTemp = "0" & strTemp
          End If
          Select Case Left(strTemp, 1)
            Case 1
              strOutput = strOutput & "th"
            Case Else
              Select Case Right(strTemp, 1)
                Case 1
                  strOutput = strOutput & "st"
                Case 2
                  strOutput = strOutput & "cnd"
                Case 3
                  strOutput = strOutput & "rd"
                Case Else
                  strOutput = strOutput & "th"
              End Select
          End Select
        Case "w"
          strOutput = strOutput & (DatePart("w", strDateTime) - 1)
        Case "Z"
          strOutput = strOutput & DatePart("y", strDateTime)
        ' week
        Case "W"
          strOutput = strOutput & DatePart("ww", strDateTime)
        ' month
        Case "B"
          Select Case DatePart("m", strDateTime)
            Case 1
              strOutput = strOutput & "January"
            Case 2
              strOutput = strOutput & "February"
            Case 3
              strOutput = strOutput & "March"
            Case 4
              strOutput = strOutput & "April"
            Case 5
              strOutput = strOutput & "May"
            Case 6
              strOutput = strOutput & "June"
            Case 7
              strOutput = strOutput & "July"
            Case 8
              strOutput = strOutput & "August"
            Case 9
              strOutput = strOutput & "September"
            Case 10
              strOutput = strOutput & "October"
            Case 11
              strOutput = strOutput & "November"
            Case 12
              strOutput = strOutput & "December"
          End Select
        Case "m"
          If DatePart("m", strDateTime) < 10 Then
            strOutput = strOutput & "0" & DatePart("m", strDateTime)  
          Else
            strOutput = strOutput & DatePart("m", strDateTime)
          End If
        Case "M"
          Select Case DatePart("m", strDateTime)
            Case 1
              strOutput = strOutput & "Jan"
            Case 2
              strOutput = strOutput & "Feb"
            Case 3
              strOutput = strOutput & "Mar"
            Case 4
              strOutput = strOutput & "Apr"
            Case 5
              strOutput = strOutput & "May"
            Case 6
              strOutput = strOutput & "Jun"
            Case 7
              strOutput = strOutput & "Jul"
            Case 8
              strOutput = strOutput & "Aug"
            Case 9
              strOutput = strOutput & "Sep"
            Case 10
              strOutput = strOutput & "Oct"
            Case 11
              strOutput = strOutput & "Nov"
            Case 12
              strOutput = strOutput & "Dec"
          End Select
        Case "n"
          strOutput = strOutput & DatePart("m", strDateTime)
        ' Case "t" ' number of days in given month
        ' year
        ' Case "L" ' whether it's a leap year
        ' Case "o"
        Case "Y"
          strOutput = strOutput & DatePart("yyyy", strDateTime)
        Case "y"
          strOutput = strOutput & Right(DatePart("yyyy", strDateTime), 2)
        ' time
        Case "a"
          If DatePart("h", strDateTime) < 12 Then
            strOutput = strOutput & "am"
          Else 
            strOutput = strOutput & "pm"
          End If
        Case "A"
          If DatePart("h", strDateTime) < 12 Then
            strOutput = strOutput & "AM"
          Else 
            strOutput = strOutput & "PM"
          End If
        ' Case "B" ' swatch
        Case "g"
          If DatePart("h", strDateTime) = 0 Then
            strOutput = strOutput & 12
          ElseIf DatePart("h", strDateTime) <= 12 Then
            strOutput = strOutput & DatePart("h", strDateTime)
          Else
            strOutput = strOutput & (DatePart("h", strDateTime) - 12)
          End If
        Case "G"
          strOutput = strOutput & DatePart("h", strDateTime)
        Case "h"
          If DatePart("h", strDateTime) = 0 Then
            strTemp = 12
          ElseIf DatePart("h", strDateTime) <= 12 Then
            strTemp = DatePart("h", strDateTime)
          Else
            strTemp = (DatePart("h", strDateTime) - 12)
          End If
          If strTemp < 10 Then
            strOutput = strOutput & 0 & strTemp
          Else
            strOutput = strOutput & strTemp
          End If
        Case "H"
          If DatePart("h", strDateTime) < 10 Then
            strOutput = strOutput & 0 & (DatePart("h", strDateTime))
          Else
            strOutput = strOutput & (DatePart("h", strDateTime))
          End If
        Case "i"
          If DatePart("n", strDateTime) < 10 Then
            strOutput = strOutput & 0 & (DatePart("n", strDateTime))
          Else
            strOutput = strOutput & (DatePart("n", strDateTime))
          End If
        Case "s"
          If DatePart("s", strDateTime) < 10 Then
            strOutput = strOutput & 0 & (DatePart("s", strDateTime))
          Else
            strOutput = strOutput & (DatePart("s", strDateTime))
          End If
        ' Case "u" ' microseconds
        ' timezone
        ' Case "e" ' timezone identifier
        ' Case "I" ' daylight savings time boolean
        ' Case "O" ' difference to GMT (0x00)
        'Case "P" ' differenct to GMT (0x:00)
        ' Case "T" ' timezone abbreviation
        ' Case "Z" ' timezone offset in seconds
        ' full
        ' Case "c" ' IS0 8601
        ' Case "r" ' RFC 2822
        ' Case "U" ' seconds since Unix epoch
        Case "\"
          bolEscape = 1
        Case Else
          strOutput = strOutput & Mid(strFormatString, intI, 1)
      End Select
    Else
      strOutput = strOutput & Mid(strFormatString, intI, 1)
      bolEscape = 0
    End If
  Next
  
  PHPFormatDateTime = strOutput
End Function

The second function uses a format string like with the standard *NIX date command. This is one of the many sites with information about this format. The similarly long function follows:

Function BASHFormatDateTime(strDateTime, strFormatString)
  Dim intI, strOutput, strTemp, bolEscape
  bolEscape = 0
  
  For intI = 1 to Len(strFormatString)
    If bolEscape = 1 then
      Select Case Mid(strFormatString, intI, 1)
        ' day
        Case "d" ' day of month (e.g, 01)
          If DatePart("d", strDateTime) < 10 Then
            strOutput = strOutput & "0" & DatePart("d", strDateTime)  
          Else
            strOutput = strOutput & DatePart("d", strDateTime)
          End If
        Case "e" ' day of month, space padded; same as %_d
          strOutput = strOutput & " " & DatePart("d", strDateTime)  
        Case "a" ' locale's abbreviated weekday name (e.g., Sun)
          Select Case DatePart("w", strDateTime)
            Case 1
              strOutput = strOutput &  "Mon"
            Case 2
              strOutput = strOutput &  "Tue"
            Case 3
              strOutput = strOutput &  "Wed"
            Case 4
              strOutput = strOutput &  "Thu"
            Case 5
              strOutput = strOutput &  "Fri"
            Case 6
              strOutput = strOutput &  "Sat"
            Case 7
              strOutput = strOutput &  "Sun"
          End Select
        Case "A" ' locale's full weekday name (e.g., Sunday)
          Select Case DatePart("w", strDateTime)
            Case 1
              strOutput = strOutput &  "Monday"
            Case 2
              strOutput = strOutput &  "Tuesday"
            Case 3
              strOutput = strOutput &  "Wednesday"
            Case 4
              strOutput = strOutput &  "Thursday"
            Case 5
              strOutput = strOutput &  "Friday"
            Case 6
              strOutput = strOutput &  "Saturday"
            Case 7
              strOutput = strOutput &  "Sunday"
          End Select
        Case "u" ' day of week (1..7); 1 is Monday
          strOutput = strOutput & (DatePart("w", strDateTime))
        Case "w" '  day of week (0..6); 0 is Sunday
          strOutput = strOutput & (DatePart("w", strDateTime, vbSaturday) - 1)
        Case "j" ' day of year (001..366)
          strTemp = DatePart("y", strDateTime)
          If strTemp < 10 Then
            strOutput = strOutput & "00" & strTemp
          ElseIf strTemp < 100 Then
            strOutput = strOutput & "0" & strTemp
          Else
            strOutput = strOutput  & strTemp
          End If
        ' week
        Case "U" ' week number of year, with Sunday as first day of week (00..53)
          strTemp = DatePart("ww", strDateTime, vbSunday, vbSunday)
          If strTemp < 10 Then
            strOutput = strOutput & "0" & (strTemp)
          Else
            strOutput = strOutput  & (strTemp)
          End If
        Case "W" ' week number of year, with Monday as first day of week (00..53)
          strTemp = DatePart("ww", strDateTime, vbMonday, vbMonday)
          If strTemp < 10 Then
            strOutput = strOutput & "0" & (strTemp)
          Else
            strOutput = strOutput  & (strTemp)
          End If
        'Case "g" ' last two digits of year of ISO week number
        '  strOutput = strOutput & DatePart("ww", strDateTime)
        ' Case "G" ' year of ISO week number (see %V); normally useful only with %V
        ' Case "V" ' ISO week number, with Monday as first day of week (01..53)
        ' month
        Case "m" ' month (01..12)
          If DatePart("m", strDateTime) < 10 Then
            strOutput = strOutput & "0" & DatePart("m", strDateTime)  
          Else
            strOutput = strOutput & DatePart("m", strDateTime)
          End If
        Case "b", "h" ' locale's abbreviated month name (e.g., Jan)
          Select Case DatePart("m", strDateTime)
            Case 1
              strOutput = strOutput & "Jan"
            Case 2
              strOutput = strOutput & "Feb"
            Case 3
              strOutput = strOutput & "Mar"
            Case 4
              strOutput = strOutput & "Apr"
            Case 5
              strOutput = strOutput & "May"
            Case 6
              strOutput = strOutput & "Jun"
            Case 7
              strOutput = strOutput & "Jul"
            Case 8
              strOutput = strOutput & "Aug"
            Case 9
              strOutput = strOutput & "Sep"
            Case 10
              strOutput = strOutput & "Oct"
            Case 11
              strOutput = strOutput & "Nov"
            Case 12
              strOutput = strOutput & "Dec"
          End Select
        ' year
        Case "C" ' century; like %Y, except omit last two digits (e.g., 21)
          strOutput = strOutput & Left(DatePart("yyyy", strDateTime), 2)
        Case "y" ' last two digits of year (00..99)
          strOutput = strOutput & Right(DatePart("yyyy", strDateTime), 2)
        Case "Y" ' full year
          strOutput = strOutput & DatePart("yyyy", strDateTime)
        ' time
        Case "P" ' like %p, but lower case
          If DatePart("h", strDateTime) < 12 Then
            strOutput = strOutput & "am"
          Else 
            strOutput = strOutput & "pm"
          End If
        Case "p" ' locale's equivalent of either AM or PM; blank if not known
          If DatePart("h", strDateTime) < 12 Then
            strOutput = strOutput & "AM"
          Else 
            strOutput = strOutput & "PM"
          End If
        Case "l" ' hour ( 1..12)
          If DatePart("h", strDateTime) = 0 Then
            strOutput = strOutput & 12
          ElseIf DatePart("h", strDateTime) <= 12 Then
            strOutput = strOutput & DatePart("h", strDateTime)
          Else
            strOutput = strOutput & (DatePart("h", strDateTime) - 12)
          End If
        Case "k" ' hour ( 0..23)
          strOutput = strOutput & DatePart("h", strDateTime)
        Case "I" ' hour (01..12)
          If DatePart("h", strDateTime) = 0 Then
            strTemp = 12
          ElseIf DatePart("h", strDateTime) <= 12 Then
            strTemp = DatePart("h", strDateTime)
          Else
            strTemp = (DatePart("h", strDateTime) - 12)
          End If
          If strTemp < 10 Then
            strOutput = strOutput & 0 & strTemp
          Else
            strOutput = strOutput & strTemp
          End If
        Case "H" ' hour (00..23)
          If DatePart("h", strDateTime) < 10 Then
            strOutput = strOutput & 0 & (DatePart("h", strDateTime))
          Else
            strOutput = strOutput & (DatePart("h", strDateTime))
          End If
        Case "M" ' minute (00..59)
          If DatePart("n", strDateTime) < 10 Then
            strOutput = strOutput & 0 & (DatePart("n", strDateTime))
          Else
            strOutput = strOutput & (DatePart("n", strDateTime))
          End If
        Case "S" ' second (00..60)
          If DatePart("s", strDateTime) < 10 Then
            strOutput = strOutput & 0 & (DatePart("s", strDateTime))
          Else
            strOutput = strOutput & (DatePart("s", strDateTime))
          End If
        ' Case "N" ' nanoseconds
        ' Case "s" ' seconds since unix epoch
        ' Case "z", ":z" ..., "Z" all for timezone
        ' formatted
        Case "c"
          strOutput = strOutput & BASHFormatDateTime(strDateTime, "%a %b %e %T %Y")
        Case "D"
          strOutput = strOutput & BASHFormatDateTime(strDateTime, "%m/%d/%y")
        Case "F"
          strOutput = strOutput & BASHFormatDateTime(strDateTime, "%Y-%m-%d")
        Case "r"
          strOutput = strOutput & BASHFormatDateTime(strDateTime, "%I:%M:%S %p")
        Case "R"
          strOutput = strOutput & BASHFormatDateTime(strDateTime, "%H:%M")
        Case "T"
          strOutput = strOutput & BASHFormatDateTime(strDateTime, "%H:%M:%S")
        ' Case "x" ' locales date representation
        ' Case "X" ' locales time representation
        ' etc
        Case "n"
          strOutput = strOutput & "<br />" ' or vbcrlf
        Case "t"
          strOutput = strOutput & "    " ' or vbtab
        Case Else
          strOutput = strOutput & Mid(strFormatString, intI, 1)
      End Select
      bolEscape = 0
    Else
      If Mid(strFormatString, intI, 1) = "%" Then
        bolEscape = 1
      Else
        strOutput = strOutput & Mid(strFormatString, intI, 1)
      End If
    End If
  Next
  
  BASHFormatDateTime = strOutput
End Function

For testing purposes, I stuck those in a file with this form and processor for testing:

If Request.Item("format") & "" <> "" Then
  Dim i, varDate, varOutput
  Dim varDatePart

  For i = 1 to  31
    'set date
    If i <= 24 then
      varDatePart = i - 1
    Else 
      varDatePart = 1
    End If
    
    'varDate = varDatePart & "/" & i
     If i < 10 Then
      varDate = "2009-01-0" & i & " " & varDatePart & ":" & (varDatePart + 10) & ":" & (varDatePart + 23)
    Else
      varDate = "2009-01-" & i & " " & varDatePart & ":" & (varDatePart + 10) & ":" & (varDatePart + 23)
    End If
    
    'Response.Write(PHPFormatDateTime(varDate, "F jS, Y") & "<br />")
    'Response.Write("Date: " & PHPFormatDateTime(varDate, "w d l \t\h\e jS M(F) Z W m/d y(Y) g:i:s a G:i:s h:i:s A H:i:s") & "<br />")
    'Response.Write(DatePart("w", varDate) & "<br />")
    Select Case Request.Form("type")
      Case "PHP"
        Response.Write(PHPFormatDateTime(varDate, Request.Form("format"))&"<br />")
      Case "BASH"
        Response.Write(BASHFormatDateTime(varDate, Request.Form("format"))&"<br />")
    End Select
  Next
End If

I don’t code in classic ASP at all anymore, and I think .NET is taking over that segment of development, but hopefully this will help someone stuck with old servers anyway.

    • nospam
    • January 8th, 2012

    in ASP there is FormatDateTime(date,format)

    • I forget if that’s the one, but I know there was a date function I found that wasn’t available on our older server version. Looks like that one only has like 5 formatting possibilities anyway, so if we did have that available, it might wouldn’t have been capable enough.

  1. No trackbacks yet.

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Connecting to %s

Follow

Get every new post delivered to your Inbox.