格式字符串在JavaScript中的应用


在使用JavaScript中的Date对象时,有一个常用的操作就是输出。但Date对象自带的toString()方法输出的格式并不能满足用户多样化的需求。我在想,是不是可以将C#中DateTime.ToString(string format)方法的形式引入到JavaScript中呢?

  经过一番设计,终于完成了这个功能。引入了这个js后,就可以自行配置格式字符串来输出各种自定义的日期格式了。

  流程图

  可以看出,所谓格式字符串,其实就是一个含有特定字符的字符串,然后根据其的实际意义替换成指定的值。

  在本文中仅以Date对象作为示例,其实格式字符串的价值不仅于此。到底可以在什么情景下会使用格式字符串呢?希望您在本文的结尾处可以找到答案。

  算法介绍
下面我将使用一个示例来说明格式字符串的算法。这个示例将格式化日期的“日”部分,例如2008-8-8,如果格式字符串是“d”,将输出“8”;如果格式字符串是“dd”,将输出“08”;如果格式字符串是“dddd”,将输出“五”;如果格式字符串是“dddd”,将输出“星期五”。其中参数d是一个Date对象,format是一个字符串:

//格式化日
function FormatDay(d, format){
     while(format.indexOf("d") > -1){
         var regex = /[d]+/;
         format = format.replace(regex,function(w){
              switch(w.length){
                   case 0:break;
                   case 1:
                       return d.getDate();
                   case 2:
                       return d.getDate() < 10 ? "0" + d.getDate() : d.getDate();
                   case 3:
                       switch(d.getDay()){
                            case 0:
                                 return "日";
                            case 1:
                                 return "一";
                            case 2:
                                 return "二";
                            case 3:
                                 return "三";
                            case 4:
                                 return "四";
                            case 5:
                                 return "五";
                            case 6:
                                 return "六";
                       }
                   default:
                       switch(d.getDay()){
                            case 0:
                                 return "星期日";
                            case 1:
                                 return "星期一";
                            case 2:
                                 return "星期二";
                            case 3:
                                 return "星期三";
                            case 4:
                                 return "星期四";
                            case 5:
                                 return "星期五";
                            case 6:
                                 return "星期六";
                       }
              }
         });
     }
     return format;
}

  可以看到,其核心的部分就是:

while (format.indexOf("d") > -1) {
    var regex = /[d]+/;
    format = format.replace(regex, function(w) {
        switch (w.length) {
            case 0: break;
            case 1:
                //todo
            case 2:
                //todo
            case 3:
                //todo
            case x:
                //todo
            default:
                //todo
        }
    });
}

 

  解释:

  1.         使用while循环,只要格式字符串format中含有特定字符就一直执行下去;

  2.         声明一个正则表达式对象/[x]+/,其中x表示特定字符;

  3.         使用string对象的replace方法替换特定字符;

  4.         根据匹配到的特定字符串的长度,执行不同的操作(在本示例中,“d”、“dd”、“ddd”代表不同的含义)。

  格式字符串说明

  以508-1-9  14:3:5为例

  格式字符串   描述   示例
  y   格式化年。年份由世纪+年代组成。   “y”输出8

  “yy”输出08

  “yyy”输出508

  “yyyy”输出0508

  “yyyyyy”输出000508

  M   格式化月。   “M”输出1

  “MM”输出01

  “MMM”或更多输出一月

  d   格式化日。   “d”输出9

  “dd” 输出09

  “ddd” 输出一

  “dddd” 或更多输出星期一

  H,h   格式化小时。其中H表示24小时制,h表示12小时制。   “H”输出14

  “HH” 或更多输出14

  “h”输出2

  “hh” 或更多输出02

  m   格式化分钟。   “m”输出3

  “mm” 或更多输出03

  s   格式化秒   “s”输出5

  “ss” 或更多输出05

  更多的设置,大家可以自己动手做一下。

  示例

  引用此js后,在浏览器的控制台中测试结果如下:

  如何,有没有心动的感觉……

  顺便说一下各浏览器的控制台呼出方式:

  浏览器   快捷键
  Chrome   Ctrl + Shift + J
  IE8   F12
  FireFox   忘了。FireFox中的控制台不是原生的,是一个叫FireBug的插件。

  源代码
下述代码可以在DateExtension.js下载

Date.prototype.ToString = function(format){
     if(typeof(format) == "string"){
         return FormatDateTime(this, format);
     }
     return FormatDateTime(this, "yyyy-MM-dd HH:mm:ss");
}
//格式化DateTime对象
function FormatDateTime(d, format){
     format = FormatYear(d, format);
     format = FormatMonth(d, format);
     format = FormatDay(d, format);
     format = FormatHour(d, format);
     format = FormatMinute(d, format);
     format = FormatSecond(d, format);
     return format;
}
//格式化年
function FormatYear(d, format){
     var fullYear = d.getFullYear(); //完整的年份
     var century = Math.floor(fullYear / 100); //世纪
     var year = fullYear % 100; //年代
     while(format.indexOf("y") > -1){
         var regex = /[y]+/;
         format = format.replace(regex,function(w){
              //格式字符串如果是"y"或者"yy"时,只返回年代。否则返回世纪+年代
              switch(w.length){
                   case 0:break;
                   case 1:
                       return year;
                   case 2:
                       return year < 10 ? "0" + year : year;
                   default:
                       var yearPart = year < 10 ? "0" + year : year;
                       var centuryPart = "";
                       for(var i = 0; i < w.length - 2 - century.toString().length; i++){
                            centuryPart += "0";
                        }
                       centuryPart += century;
                       return centuryPart + yearPart;
              }
         });
     }
     return format;
}
//格式化月
function FormatMonth(d, format){
     var month = d.getMonth() + 1;
     while(format.indexOf("M") > -1){
         var regex = /[M]+/;
         format = format.replace(regex,function(w){
              switch(w.length){
                   case 0:break;
                   case 1:
                       return month;
                   case 2:
                       return month < 10 ? "0" + month : month;
                   default:
                       switch(month){
                            case 1:
                                 return "一月";
                            case 2:
                                 return "二月";
                            case 3:
                                 return "三月";
                            case 4:
                                 return "四月";
                            case 5:
                                 return "五月";
                            case 6:
                                 return "六月";
                            case 7:
                                 return "七月";
                            case 8:
                                 return "八月";
                            case 9:
                                 return "九月";
                            case 10:
                                 return "十月";
                            case 11:
                                 return "十一月";
                            case 12:
                                 return "十二月";
                       }
              }
         });
     }
     return format;
}
//格式化日
function FormatDay(d, format){
     while(format.indexOf("d") > -1){
         var regex = /[d]+/;
         format = format.replace(regex,function(w){
              switch(w.length){
                   case 0:break;
                   case 1:
                       return d.getDate();
                   case 2:
                       return d.getDate() < 10 ? "0" + d.getDate() : d.getDate();
                   case 3:
                       switch(d.getDay()){
                            case 0:
                                 return "日";
                            case 1:
                                 return "一";
                            case 2:
                                 return "二";
                            case 3:
                                 return "三";
                            case 4:
                                 return "四";
                            case 5:
                                 return "五";
                            case 6:
                                 return "六";
                       }
                   default:
                       switch(d.getDay()){
                            case 0:
                                 return "星期日";
                            case 1:
                                 return "星期一";
                            case 2:
                                 return "星期二";
                            case 3:
                                 return "星期三";
                            case 4:
                                 return "星期四";
                            case 5:
                                 return "星期五";
                            case 6:
                                 return "星期六";
                       }
              }
         });
     }
     return format;
}
//格式化小时
//H:24小时制
//h:12小时制
function FormatHour(d, format){
     while(format.indexOf("H") > -1){
         var regex = /[H]+/;
         format = format.replace(regex,function(w){
              switch(w.length){
                   case 0:break;
                   case 1:
                       return d.getHours();
                   default:
                       return d.getHours() < 10 ? "0" + d.getHours() : d.getHours();
              }
         });
     }
     while(format.indexOf("h") > -1){
         var regex = /[h]+/;
         format = format.replace(regex,function(w){
              switch(w.length){
                   case 0:break;
                   case 1:
                       return d.getHours() > 12 ? d.getHours() - 12 : d.getHours();
                   default:
                       var t = d.getHours() > 12 ? d.getHours() - 12 : d.getHours();
                       return t < 10 ? "0" + t : t;
              }
         });
     }
     return format;
}
//格式化分钟
function FormatMinute(d, format){
     while(format.indexOf("m") > -1){
         var regex = /[m]+/;
         format = format.replace(regex,function(w){
              switch(w.length){
                   case 0:break;
                   case 1:
                       return d.getMinutes();
                   default:
                       return d.getMinutes() < 10 ? "0" + d.getMinutes() : d.getMinutes();
              }
         });
     }
     return format;
}
//格式化秒
function FormatSecond(d, format){
     while(format.indexOf("s") > -1){
         var regex = /[s]+/;
         format = format.replace(regex,function(w){
              switch(w.length){
                   case 0:break;
                   case 1:
                       return d.getSeconds();
                   default:
                       return d.getSeconds() < 10 ? "0" + d.getSeconds() : d.getSeconds();
              }
         });
     }
     return format;
}



相关阅读:
查找运行系统里的bad sql语句的好方法
Linux VI编辑器中的复制与粘贴
PHP EOT定界符的使用详解
W3C Widget 配置与打包
Javascript实现的鼠标经过时播放声音
用javascript 转换外部链接样式
对话Linux核心专家:多版本是Linux灵魂
cnct.batch 批处理不错的东西%cd%
JavaScript发展与互联网
javascript表达式和运算符
15个提升WordPress用户工作效率的工具
如何去掉文章里的 html 语法
用css filter做鼠标滑过图片效果
自己写的一个asp.net-cookies购物车类
快速导航
PHP MySQL HTML CSS JavaScript MSSQL AJAX .NET JSP Linux Mac ASP 服务器 SQL jQuery C# C++ java Android IOS oracle MongoDB SQLite wamp 交通频道 作文范文 一个女教师的传奇史诗(6) 童年趣事 袁宇航 教师演讲稿——我是光荣的人民教师 徐敬业火中脱脸的故事 度量人生,许会坦然 关于正能量的作文800字 家搬达县中学 我是一只青蛙作文800字 慢慢的,学会让风吹走一切 慕云清浅,一起等时光尽老 词句精选:名人传好词好句 泪打湿我走过的路 描写秋天落叶的诗句 万叶千声皆是恨 今年中秋节高速免费吗 羞死祖辈 谁有伤感的句子 有没有伤感的句子 唯美爱情语录35条:最幸福的爱情没有言语 看人出糗偷着乐,嘿嘿 幼儿园教师 运动培训后的感悟 Brugada综合症的认识及进展 伟 大 的 母 爱 —— 读 《 游 子 吟 》 有 感 2013试用期转正工作总结范文 唐诗发展的四个时期和艺术成就 国庆旅游周记 第五单元 杰出的科学家 小学六年级作文650字:乌鸦与狐狸 竞聘机关中层演讲稿(税务) 我国经济型酒店现状及对策分析 作文我的同桌 工伤赔偿协议书范本 懒懒散散地走 试论×热电厂加强企业精神文化建设的必要性_会议发言 知羞耻而后勇 鹰者,雄者作文700字 在市委征求意见座谈会上的发言(先进性教育) 如果你有个同事是Bitch 孔雀东南飞之双宿双飞作文400字 学弈教学设计 一个文明使者 振奋的2014年 爱,爱你 每个人都在为了自己的事业拼搏 错了,乱了 无论怎样,找个会为你心疼你的男人 中学生五四青年节演讲稿-火红的团旗 《争做校园清洁小卫士》小学主题班会 你这个该死的男人 我的“恶作剧”同桌500字 谁,会是你心灵独白时默默的倾听者? 爱心,拯救自己

Copyright © 2016 phpStudy |