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

javascript格式化日期

admin
2012年3月27日 14:9 本文热度 2744

   对日期型数据进行格式化是我们经常遇到的一个问题,但是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