對日期型數(shù)據(jù)進(jìn)行格式化是我們經(jīng)常遇到的一個問題,但是javascript中并沒有提供對日期進(jìn)行格式化的函數(shù),所以在網(wǎng)上就出現(xiàn)了很多版本的格式化函數(shù),寫法不盡相同,但基本都可以達(dá)到所需的目標(biāo)。我這里也寫出了一個類似功能的函數(shù),一來鞏固一下所學(xué)的javascript知識,也可以給大家提供一個參考。
下面是這個函數(shù)的主體實(shí)現(xiàn)部分:
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- function formatDate(date,pattern){
- var d;
- if((d=parseDate(date))==null){
- return "";
- }
- if(!pattern){
- pattern = "yyyy-MM-dd";
- }
- var arrWeek = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六","Sunday","Monday","Tuesday","Tuesday","Thursday","Friday","Saturday"];
- var value = new Object();
- value["y"] = parseString(date.getFullYear());
- value["M"] = parseString(date.getMonth() + 1);
- value["d"] = parseString(date.getDate());
- value["H"] = parseString(date.getHours());
- value["h"] = parseString(value["H"] > 12 ? (value["H"]-12) : value["H"]);
- value["m"] = parseString(date.getMinutes());
- value["s"] = parseString(date.getSeconds());
- value["S"] = parseString(date.getMilliseconds());
- value["E"] = arrWeek[date.getDay()];
- value["e"] = arrWeek[date.getDay() + 7];
- value["a"] = (value["H"] > 12 ? "PM" : "AM");
- value["A"] = (value["H"] > 12 ? "下午" : "上午");
- var result = "";
- var i = 0;
- var hasE = false;
- var hasAMPM = false;
- while(i < pattern.length){
- var c = pattern.charAt(i++);
- var lc = c;
- var tmpStr = c;
- while(i < pattern.length && (c=pattern.charAt(i))==lc){
- tmpStr += c;
- i++;
- }
- if(value[lc]!=""&&value[lc]!=null&&value[lc]!="undefined"){
-
- if((lc == "E" || lc == "e") && !hasE){
-
- result += value[lc];
- hasE = true;
- } else if(lc == "E" || lc == "e") {
- result += tmpStr;
- } else if((lc=="a" || lc == "A") && !hasAMPM){
-
- result += value[lc];
- hasAMPM = true;
- } else if((lc=="a" || lc == "A") ){
- result += tmpStr;
- } else {
-
- if(tmpStr == "d" || tmpStr == "M" || tmpStr=="H" || tmpStr=="h" || tmpStr == "m" || tmpStr == "s"){
- result += value[lc];
- } else {
- result += value[lc].fillChar(tmpStr.length);
- }
- }
- } else {
- result += tmpStr;
- }
- }
- return result;
- }
/**
* 對日期進(jìn)行格式化,
* @param date 要格式化的日期
* @param pattern 進(jìn)行格式化的模式
* 支持的模式字母有:
* y:年,
* M:年中的月份(1-12),
* d:月份中的天(1-31),
* H:小時(shí)(0-23),
* h:小時(shí)(0-12),
* m:分(0-59),
* s:秒(0-59),
* S:毫秒(0-999),
* E:星期(以漢語表示),
* e:星期(以英文表示),
* A:上午/下午標(biāo)識,
* a:AM/PM標(biāo)識
* @return
*/
function formatDate(date,pattern){
var d;
if((d=parseDate(date))==null){
return "";
}
if(!pattern){
pattern = "yyyy-MM-dd";
}
var arrWeek = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六","Sunday","Monday","Tuesday","Tuesday","Thursday","Friday","Saturday"];
var value = new Object();
value["y"] = parseString(date.getFullYear());
value["M"] = parseString(date.getMonth() + 1);
value["d"] = parseString(date.getDate());
value["H"] = parseString(date.getHours());
value["h"] = parseString(value["H"] > 12 ? (value["H"]-12) : value["H"]);
value["m"] = parseString(date.getMinutes());
value["s"] = parseString(date.getSeconds());
value["S"] = parseString(date.getMilliseconds());
value["E"] = arrWeek[date.getDay()];
value["e"] = arrWeek[date.getDay() + 7];
value["a"] = (value["H"] > 12 ? "PM" : "AM");
value["A"] = (value["H"] > 12 ? "下午" : "上午");
var result = "";
var i = 0;
var hasE = false;//是否出現(xiàn)過星期
var hasAMPM = false;//是否出現(xiàn)過上午下午
while(i < pattern.length){
var c = pattern.charAt(i++);
var lc = c;//記錄本次要處理的字母,如'y'
var tmpStr = c;//本次在處理的字母格式,如'yyyy'
while(i < pattern.length && (c=pattern.charAt(i))==lc){
tmpStr += c;
i++;
}
if(value[lc]!=""&&value[lc]!=null&&value[lc]!="undefined"){
//本次要處理的字母是模式母
if((lc == "E" || lc == "e") && !hasE){
//星期
result += value[lc];
hasE = true;
} else if(lc == "E" || lc == "e") {
result += tmpStr;
} else if((lc=="a" || lc == "A") && !hasAMPM){
//上下午
result += value[lc];
hasAMPM = true;
} else if((lc=="a" || lc == "A") ){
result += tmpStr;
} else {
//如果是 單個的日期,月份,小時(shí),分,秒的字符串,不能再進(jìn)行字符串的截取操作
if(tmpStr == "d" || tmpStr == "M" || tmpStr=="H" || tmpStr=="h" || tmpStr == "m" || tmpStr == "s"){
result += value[lc];
} else {
result += value[lc].fillChar(tmpStr.length);
}
}
} else {//非模式字母,直接輸出
result += tmpStr;
}
}
return result;
}
先來看一下它能給我們帶來什么樣的效果吧,測試的代碼如下:
- var date = new Date();
- document.write(formatDate(date,"yyyy-MM-dd HH:mm:ss.SSS E") + "<br>");
- document.write(formatDate(date,"yyyy年MM月dd日 HH時(shí)mm分ss秒 E") + "<br>");
- document.write(formatDate(date,"yyyy-M-d hh:mm:ss.SSS A E") + "<br>");
- document.write(formatDate(date,"MM/dd/yy hh:mm:ss a e") + "<br>");
- document.write(formatDate(date,"M/d/yyyy") + "<br>");
- document.write(formatDate(date,"yyyyyy年MMMMMMM月ddddddd日 HH時(shí)mm分ss秒 EEEEE") + "<br>");[color=red]最后這個有點(diǎn)變態(tài)了,看它會出現(xiàn)什么結(jié)果[/color]
- ??為什么這里不能顯示為紅色呢
var date = new Date();
document.write(formatDate(date,"yyyy-MM-dd HH:mm:ss.SSS E") + "<br>");
document.write(formatDate(date,"yyyy年MM月dd日 HH時(shí)mm分ss秒 E") + "<br>");
document.write(formatDate(date,"yyyy-M-d hh:mm:ss.SSS A E") + "<br>");
document.write(formatDate(date,"MM/dd/yy hh:mm:ss a e") + "<br>");
document.write(formatDate(date,"M/d/yyyy") + "<br>");
document.write(formatDate(date,"yyyyyy年MMMMMMM月ddddddd日 HH時(shí)mm分ss秒 EEEEE") + "<br>");[color=red]最后這個有點(diǎn)變態(tài)了,看它會出現(xiàn)什么結(jié)果[/color]
??為什么這里不能顯示為紅色呢
測試輸出為:
- 2010-10-07 17:08:34.187 星期四
- 2010年10月07日 17時(shí)08分34秒 星期四
- 2010-10-7 05:08:34.187 下午 星期四
- 10/07/10 05:08:34 PM Thursday
- 10/7/2010
- 002010年0000010月0000007日 17時(shí)23分41秒 星期四
2010-10-07 17:08:34.187 星期四
2010年10月07日 17時(shí)08分34秒 星期四
2010-10-7 05:08:34.187 下午 星期四
10/07/10 05:08:34 PM Thursday
10/7/2010
002010年0000010月0000007日 17時(shí)23分41秒 星期四
完成上面的測試之后,發(fā)現(xiàn)這個函數(shù)已經(jīng)可以較好地為我們提供所需的功能了。這里所采用的模式字母主要參照java中的模式字母,但是只實(shí)現(xiàn)其中一部分的模式字母功能。函數(shù)中的代碼已經(jīng)盡可能地增加了注釋,為以后的再修改及大家的參考提供方便。
在上面的函數(shù)中,用到了幾個功能函數(shù),下面是它們的代碼清單。其中,前兩個函數(shù)比較簡單,相信很多人也都對這種功能不莫生;后面的fillChar函數(shù)類似于oracle中的lpad與rpad函數(shù),但也可以進(jìn)行字符串的截取操作。上面的對年份進(jìn)行截取采用的就是fillChar函數(shù);測試中的那個比較變態(tài)的格式串采用的就是它的lpad與rpad的功能。
- function parseDate(value) {
- var date = null;
- if (Date.prototype.isPrototypeOf(value)) {
- date = value;
- } else if (typeof (value) == "string") {
- date = new Date(value.replace(/-/g, "/"));
- } else if (value != null && value.getTime) {
- date = new Date(value.getTime());
- }
- ;
- return date;
- };
-
-
-
-
- function parseString(value) {
- if (value == null) {
- return "";
- } else {
- return value.toString();
- }
- };
- String.prototype.fillChar = function(length,mode,char){
- if(!char){
- char = "0";
- }
- if(this.length>length){
- if(mode=="after"){
- return this.substr(0,length);
- } else {
- return this.substr(this.length - length,length);
- }
- }
- var appendStr = "";
- for(var i = 0; i < (length - this.length)/char.length;i++){
- appendStr += char;
- }
- if(mode == "after"){
- return this + appendStr;
- }
- else {
- return appendStr + this;
- }
- };
function parseDate(value) {
var date = null;
if (Date.prototype.isPrototypeOf(value)) {
date = value;
} else if (typeof (value) == "string") {
date = new Date(value.replace(/-/g, "/"));
} else if (value != null && value.getTime) {
date = new Date(value.getTime());
}
;
return date;
};
/**
* 將對象轉(zhuǎn)換為字符串類型
*/
function parseString(value) {
if (value == null) {
return "";
} else {
return value.toString();
}
};
String.prototype.fillChar = function(length,mode,char){
if(!char){
char = "0";
}
if(this.length>length){//比實(shí)際想要的長度更大
if(mode=="after"){//如果是要在后面填充,截取的時(shí)候會將會后面的部分截取掉
return this.substr(0,length);
} else {//默認(rèn)截取前一部分的數(shù)據(jù)
return this.substr(this.length - length,length);
}
}
var appendStr = "";
for(var i = 0; i < (length - this.length)/char.length;i++){
appendStr += char;
}
if(mode == "after"){
return this + appendStr;
}
else {
return appendStr + this;
}
};
功能算是實(shí)現(xiàn)了,但是做為javascript的初學(xué)者,對這樣的代碼書寫格式及代碼的效率都難以把握。希望高手看到后能對效率優(yōu)化及代碼優(yōu)化方面不吝指導(dǎo)。