'php的date函數格式在asp中的實現,有些非ASP能完成的格式符號預留出來了 'last update: 2008/6/12 '1/增加了GMT時區定義 '2/FormatTime裡用數組做臨時傳回值 '3/GFormatTime改成FormatGTime,使函數更接近VBS的Format系列的命名規則 '2008/8/7 '增加逸出字元支援 '格林威治時間的格式取消了函數內附加的[GMT]字串,改用在格式字串裡定義,參考範例 '增加了RFC 822協議的日期格式 '2009/3/8 'FormatGTime格式日期採用類型格式,不再使用字串格式 Public Const GMT_TIMEZONE = 8 '與格林威治時間相差的小時數,中國的是+8 Public Function IIf(ByVal blnExp, vtTrue, vtFalse) If blnExp Then IIf = vtTrue Else IIf = vtFalse End If End Function '補0 Private Function FillZero(ByVal iValue) FillZero = IIf(iValue < 10, "0", "") & iValue End Function Function FormatTime(ByVal dtmValue, ByVal strFmt) Dim pWeek Dim pWeekFull Dim pMonth Dim pMonthFull Dim ret, tmp Dim i, l Dim y, m, d, h, n, s, w pWeek = Array("Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat") pWeekFull = Array("Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday") pMonth = Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec") pMonthFull = Array("January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December") y = Year(dtmValue) m = Month(dtmValue) d = Day(dtmValue) h = Hour(dtmValue) n = Minute(dtmValue) s = Second(dtmValue) w = Weekday(dtmValue) l = Len(strFmt) ReDim ret(l - 1) For i = 1 To l tmp = Mid(strFmt, i, 1) Select Case tmp Case "a": 'a 小寫上午和下午值 am 或 pm ret(i - 1) = IIf(h < 12, "am", "pm") Case "A": 'A 大寫的上午和下午值 AM 或 PM ret(i - 1) = IIf(h < 12, "AM", "PM") Case "B": 'B Swatch Internet 標準時 000 到 999 Case "d": 'd 月份中的第幾天,有前置字元為零的 2 位元字 01 到 31 ret(i - 1) = FillZero(d) Case "D": 'D 星期中的第幾天,文本表示,3 個字母 Mon 到 Sun ret(i - 1) = pWeek(w - 1) Case "F": 'F 月份,完整的文字格式設定,例如 January 或者 March January 到 December ret(i - 1) = pMonthFull(m - 1) Case "g": 'g 小時,12 小時格式,沒有前置字元為零 1 到 12 ret(i - 1) = (h Mod 12) Case "G": 'G 小時,24 小時格式,沒有前置字元為零 0 到 23 ret(i - 1) = h Case "h": 'h 小時,12 小時格式,有前置字元為零 01 到 12 ret(i - 1) = FillZero(h Mod 12) Case "H": 'H 小時,24 小時格式,有前置字元為零 00 到 23 ret(i - 1) = FillZero(h) Case "i": 'i 有前置字元為零的分鐘數 00 到 59> ret(i - 1) = FillZero(n) Case "I": 'ret(i - 1) = tt->tm_isdst'I 是否為夏令時 如果是夏令時為 1,否則為 0 Case "j": 'j 月份中的第幾天,沒有前置字元為零 1 到 31 ret(i - 1) = d Case "l": 'l(“L”的小寫字母) 星期幾,完整的文字格式設定 Sunday 到 Saturday ret(i - 1) = pWeekFull(w - 1) Case "L": 'L 是否為閏年 如果是閏年為 1,否則為 0 ret(i - 1) = IIf((y Mod 4 = 0 And y Mod 100 <>0) Or y Mod 400 = 0, 1, 0) Case "m": 'm 數字表示的月份,有前置字元為零 01 到 12 ret(i - 1) = FillZero(m) Case "M": 'M 三個字母縮寫表示的月份 Jan 到 Dec ret(i - 1) = pMonth(m - 1) Case "n": 'n 數字表示的月份,沒有前置字元為零 1 到 12 ret(i - 1) = m Case "O": 'O 與格林威治時間相差的小時數 例如:+0200 ret(i - 1) = "$1$200" If GMT_TIMEZONE < 0 Then ret(i - 1) = Replace(ret(i - 1), "$1", "-") Else ret(i - 1) = Replace(ret(i - 1), "$1", "+") End If ret(i - 1) = Replace(ret(i - 1), "$2", FillZero(Abs(GMT_TIMEZONE))) Case "r": 'r RFC 822 格式的日期 例如:Thu, 21 Dec 2000 16:01:07 +0200 ret(i - 1) = FormatTime(dtmValue, "D, j M Y H:i:s O") Case "s": 's 秒數,有前置字元為零 00 到 59> ret(i - 1) = FillZero(s) Case "S": 'S 每月天數後面的英文尾碼,2 個字元 st,nd,rd 或者 th。可以和 j 一起用。 Case "t": 't 給定月份所應有的天數 28 到 31 If m = 1 Or m = 3 Or m = 5 Or m = 7 Or m = 8 Or m = 10 Or m = 12 Then ret(i - 1) = 31 ElseIf m = 4 Or m = 6 Or m = 9 Or m = 11 Then ret(i - 1) = 30 Else ret(i - 1) = IIf((y Mod 4 = 0 And y Mod 100 <>0) Or y Mod 400 = 0, 29, 28) End If Case "T": 'T 時區 Case "U": 'U 從 Unix 紀元(January 1 1970 00:00:00 GMT)開始至今的秒數 參見 time() ret(i - 1) = DateDiff("s", "1970-01-01 00:00:00", dtmValue) Case "w": 'w 星期中的第幾天,數字表示 0(表示星期天)到 6(表示星期六) ret(i - 1) = w Case "W": 'W ISO-8601 格式年份中的第幾周,每周從星期一開始(PHP 4.1.0 新加的) 例如:42(當年的第 42 周) Case "Y": 'Y 4 位元字完整表示的年份 例如:1999 或 2003 ret(i - 1) = y Case "y": 'y 2 位元字表示的年份 例如:99 或 03 ret(i - 1) = Right(y, 2) Case "z": 'z 年份中的第幾天 0 到 366 ret(i - 1) = DateDiff("d", y & "-01-01", dtmValue) Case "Z": 'Z 時差位移量的秒數。UTC 西邊的時區位移量總是負的,UTC 東邊的時區位移量總是正的。 Case "/": '逸出字元 i = i + 1 ret(i - 1) = Mid(strFmt, i, 1) Case Else ret(i - 1) = tmp End Select Next FormatTime = Join(ret, Empty) End Function 'intType = 格式類型,=0,加GMT尾碼;=1,加UTC尾碼 Public Function FormatGTime(ByVal dtmValue, ByVal intType) FormatGTime = FormatTime(DateAdd("h", 0 - GMT_TIMEZONE, dtmValue), IIf(intType = 0, "D, j M Y H:i:s /G/M/T", "D, j M Y H:i:s /U/T/C") End Function 'e.g. 'yyyy-mm-dd hh24:mi:ss格式 WScript.Echo FormatTime(Now(), "Y-m-d H:i:s") '有前置0的日期 WScript.Echo FormatTime(Now(), "Y年m月d日 H時i分s秒") '無前置0的日期 WScript.Echo FormatTime(Now(), "Y年n月j日 g時i分s秒") 'RFC 822協議的日期格式 WScript.Echo FormatTime(Now(), "r") '格林威治時間 WScript.Echo FormatGTime(Now(), 0) WScript.Echo FormatGTime(Now(), 1)