LOGO OA教程 ERP教程 模切知识交流 PMS教程 CRM教程 开发文档 其他文档  
 
网站管理员

javascript格式化日期

admin
2012年3月27日 14:9 本文热度 2595
   对日期型数据进行格式化是我们经常遇到的一个问题,但是javascript中并没有提供对日期进行格式化的函数,所以在网上就出现了很多版本的格式化函数,写法不尽相同,但基本都可以达到所需的目标。我这里也写出了一个类似功能的函数,一来巩固一下所学的javascript知识,也可以给大家提供一个参考。
    下面是这个函数的主体实现部分:
Js代码
  1. /**
  2.  * 对日期进行格式化,  
  3.  * @param date 要格式化的日期  
  4.  * @param pattern 进行格式化的模式  
  5.  *     支持的模式字母有:  
  6.  *     y:年,  
  7.  *     M:年中的月份(1-12),  
  8.  *     d:月份中的天(1-31),  
  9.  *     H:小时(0-23),  
  10.  *     h:小时(0-12),  
  11.  *     m:分(0-59),  
  12.  *     s:秒(0-59),  
  13.  *     S:毫秒(0-999),  
  14.  *     E:星期(以汉语表示),  
  15.  *     e:星期(以英文表示),  
  16.  *     A:上午/下午标识,  
  17.  *     a:AM/PM标识  
  18.  * @return  
  19.  */  
  20. function formatDate(date,pattern){   
  21.     var d;   
  22.     if((d=parseDate(date))==null){   
  23.         return "";   
  24.     }   
  25.     if(!pattern){   
  26.         pattern = "yyyy-MM-dd";   
  27.     }   
  28.     var arrWeek = ["星期日","星期一","星期二","星期三","星期四","星期五","星期六","Sunday","Monday","Tuesday","Tuesday","Thursday","Friday","Saturday"];   
  29.     var value = new Object();   
  30.     value["y"] = parseString(date.getFullYear());   
  31.     value["M"] = parseString(date.getMonth() + 1);   
  32.     value["d"] = parseString(date.getDate());   
  33.     value["H"] = parseString(date.getHours());   
  34.     value["h"] = parseString(value["H"] > 12 ? (value["H"]-12) : value["H"]);   
  35.     value["m"] = parseString(date.getMinutes());   
  36.     value["s"] = parseString(date.getSeconds());   
  37.     value["S"] = parseString(date.getMilliseconds());   
  38.     value["E"] = arrWeek[date.getDay()];   
  39.     value["e"] = arrWeek[date.getDay() + 7];   
  40.     value["a"] = (value["H"] > 12 ? "PM" : "AM");   
  41.     value["A"] = (value["H"] > 12 ? "下午" : "上午");   
  42.     var result = "";   
  43.     var i = 0;   
  44.     var hasE = false;//是否出现过星期   
  45.     var hasAMPM = false;//是否出现过上午下午   
  46.     while(i < pattern.length){   
  47.         var c = pattern.charAt(i++);   
  48.         var lc = c;//记录本次要处理的字母,如'y'   
  49.         var tmpStr = c;//本次在处理的字母格式,如'yyyy'   
  50.         while(i < pattern.length && (c=pattern.charAt(i))==lc){   
  51.             tmpStr += c;   
  52.             i++;   
  53.         }   
  54.         if(value[lc]!=""&&value[lc]!=null&&value[lc]!="undefined"){   
  55.             //本次要处理的字母是模式母   
  56.             if((lc == "E" || lc == "e") && !hasE){   
  57.                 //星期   
  58.                 result += value[lc];   
  59.                 hasE = true;   
  60.             } else if(lc == "E" || lc == "e") {   
  61.                 result += tmpStr;   
  62.             } else if((lc=="a" || lc == "A")  && !hasAMPM){   
  63.                 //上下午   
  64.                 result += value[lc];   
  65.                 hasAMPM = true;   
  66.             } else if((lc=="a" || lc == "A") ){   
  67.                 result += tmpStr;   
  68.             } else {   
  69.                 //如果是 单个的日期,月份,小时,分,秒的字符串,不能再进行字符串的截取操作   
  70.                 if(tmpStr == "d" || tmpStr == "M" || tmpStr=="H" || tmpStr=="h" || tmpStr == "m" || tmpStr == "s"){   
  71.                     result += value[lc];   
  72.                 } else {   
  73.                     result += value[lc].fillChar(tmpStr.length);   
  74.                 }   
  75.             }   
  76.         } else {//非模式字母,直接输出   
  77.             result += tmpStr;   
  78.         }   
  79.     }   
  80.     return result;   
  81. }  

    先来看一下它能给我们带来什么样的效果吧,测试的代码如下:
Js代码
  1. var date = new Date();
  2. document.write(formatDate(date,"yyyy-MM-dd HH:mm:ss.SSS E") + "<br>");   
  3. document.write(formatDate(date,"yyyy年MM月dd日 HH时mm分ss秒 E") + "<br>");   
  4. document.write(formatDate(date,"yyyy-M-d hh:mm:ss.SSS A E") + "<br>");   
  5. document.write(formatDate(date,"MM/dd/yy hh:mm:ss a e") + "<br>");   
  6. document.write(formatDate(date,"M/d/yyyy") + "<br>");   
  7. document.write(formatDate(date,"yyyyyy年MMMMMMM月ddddddd日 HH时mm分ss秒 EEEEE") + "<br>");[color=red]最后这个有点变态了,看它会出现什么结果[/color]   
  8. ??为什么这里不能显示为红色呢  

测试输出为:
Js代码
  1. 2010-10-07 17:08:34.187 星期四   
  2. 2010年10月07日 17时08分34秒 星期四   
  3. 2010-10-7 05:08:34.187 下午 星期四   
  4. 10/07/10 05:08:34 PM Thursday   
  5. 10/7/2010   
  6. 002010年0000010月0000007日 17时23分41秒 星期四  

    完成上面的测试之后,发现这个函数已经可以较好地为我们提供所需的功能了。这里所采用的模式字母主要参照java中的模式字母,但是只实现其中一部分的模式字母功能。函数中的代码已经尽可能地增加了注释,为以后的再修改及大家的参考提供方便。
     在上面的函数中,用到了几个功能函数,下面是它们的代码清单。其中,前两个函数比较简单,相信很多人也都对这种功能不莫生;后面的fillChar函数类似于oracle中的lpad与rpad函数,但也可以进行字符串的截取操作。上面的对年份进行截取采用的就是fillChar函数;测试中的那个比较变态的格式串采用的就是它的lpad与rpad的功能。
Js代码
  1. function parseDate(value) {   
  2.     var date = null;   
  3.     if (Date.prototype.isPrototypeOf(value)) {   
  4.         date = value;   
  5.     } else if (typeof (value) == "string") {   
  6.         date = new Date(value.replace(/-/g, "/"));   
  7.     } else if (value != null && value.getTime) {   
  8.         date = new Date(value.getTime());   
  9.     }   
  10.     ;   
  11.     return date;   
  12. };   
  13.   
  14. /**  
  15.  * 将对象转换为字符串类型  
  16.  */  
  17. function parseString(value) {   
  18.     if (value == null) {   
  19.         return "";   
  20.     } else {   
  21.         return value.toString();   
  22.     }   
  23. };   
  24. String.prototype.fillChar = function(length,mode,char){   
  25.     if(!char){   
  26.         char = "0";   
  27.     }   
  28.     if(this.length>length){//比实际想要的长度更大   
  29.         if(mode=="after"){//如果是要在后面填充,截取的时候会将会后面的部分截取掉   
  30.             return this.substr(0,length);   
  31.         } else {//默认截取前一部分的数据   
  32.             return this.substr(this.length - length,length);   
  33.         }   
  34.     }   
  35.     var appendStr = "";   
  36.     for(var i = 0; i < (length - this.length)/char.length;i++){   
  37.         appendStr += char;   
  38.     }   
  39.     if(mode == "after"){   
  40.         return this + appendStr;   
  41.     }   
  42.     else {   
  43.         return appendStr + this;   
  44.     }   
  45. };  

   功能算是实现了,但是做为javascript的初学者,对这样的代码书写格式及代码的效率都难以把握。希望高手看到后能对效率优化及代码优化方面不吝指导。

该文章在 2012/3/27 14:09:18 编辑过
关键字查询
相关文章
正在查询...
点晴ERP是一款针对中小制造业的专业生产管理软件系统,系统成熟度和易用性得到了国内大量中小企业的青睐。
点晴PMS码头管理系统主要针对港口码头集装箱与散货日常运作、调度、堆场、车队、财务费用、相关报表等业务管理,结合码头的业务特点,围绕调度、堆场作业而开发的。集技术的先进性、管理的有效性于一体,是物流码头及其他港口类企业的高效ERP管理信息系统。
点晴WMS仓储管理系统提供了货物产品管理,销售管理,采购管理,仓储管理,仓库管理,保质期管理,货位管理,库位管理,生产管理,WMS管理系统,标签打印,条形码,二维码管理,批号管理软件。
点晴免费OA是一款软件和通用服务都免费,不限功能、不限时间、不限用户的免费OA协同办公管理系统。
Copyright 2010-2024 ClickSun All Rights Reserved