'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)