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 the 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.