对日期型数据进行格式化是我们经常遇到的一个问题,但是javascript中并没有提供对日期进行格式化的函数,所以在网上就出现了很多版本的格式化函数,写法不尽相同,但基本都可以达到所需的目标。我这里也写出了一个类似功能的函数,一来巩固一下所学的javascript知识,也可以给大家提供一个参考。
下面是这个函数的主体实现部分:
/**
* 对日期进行格式化,
* @param date 要格式化的日期
* @param pattern 进行格式化的模式
* 支持的模式字母有:
* y:年,
* M:年中的月份(1-12),
* d:月份中的天(1-31),
* H:小时(0-23),
* h:小时(0-12),
* m:分(0-59),
* s:秒(0-59),
* S:毫秒(0-999),
* E:星期(以汉语表示),
* e:星期(以英文表示),
* A:上午/下午标识,
* a:AM/PM标识
* @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;//是否出现过星期
var hasAMPM = false;//是否出现过上午下午
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 {
//如果是 单个的日期,月份,小时,分,秒的字符串,不能再进行字符串的截取操作
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时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时mm分ss秒 EEEEE") + "<br>");[color=red]最后这个有点变态了,看它会出现什么结果[/color]
??为什么这里不能显示为红色呢
测试输出为:
2010-10-07 17:08:34.187 星期四
2010年10月07日 17时08分34秒 星期四
2010-10-7 05:08:34.187 下午 星期四
10/07/10 05:08:34 PM Thursday
10/7/2010
002010年0000010月0000007日 17时23分41秒 星期四
完成上面的测试之后,发现这个函数已经可以较好地为我们提供所需的功能了。这里所采用的模式字母主要参照java中的模式字母,但是只实现其中一部分的模式字母功能。函数中的代码已经尽可能地增加了注释,为以后的再修改及大家的参考提供方便。
在上面的函数中,用到了几个功能函数,下面是它们的代码清单。其中,前两个函数比较简单,相信很多人也都对这种功能不莫生;后面的fillChar函数类似于oracle中的lpad与rpad函数,但也可以进行字符串的截取操作。上面的对年份进行截取采用的就是fillChar函数;测试中的那个比较变态的格式串采用的就是它的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;
}
};
功能算是实现了,但是做为javascript的初学者,对这样的代码书写格式及代码的效率都难以把握。希望高手看到后能对效率优化及代码优化方面不吝指导。
分享到:
相关推荐
javascript格式化日期,将日期型转为字符串,字符串转为日期型,格式自由。
js 语言的格式化日期格式的类。很好用的。
由XXXX年XX月XX日转为XXXX-XX-XX replace() 方法不能用 .
jquery-dateFormat, 使用JavaScript格式化日期输出的jQuery插件 使用JavaScript格式输出日期输出的jQuery dateformat插件- 拥有的,jQuery是最小的日期格式库。 ! 安装下载最新的jquery.dateFormat.js 或者 jquery....
NULL 博文链接:https://w8700569.iteye.com/blog/882708
很多时候,我们可以利用JavaScript中Date对象的内置方法来格式化,如: 代码如下:var d = new Date();console.log(d); // 输出:Mon Nov 04 2013 21:50:33 GMT+0800 (中国标准时间)console.log(d.toDateString()); /...
JavaScript - 格式化日期时间 思路代码:demo.html 完整代码:index.html 相关教程,请前往我的博客查看。
本文给大家汇总介绍了javascript格式化日期时间的五种常用方法,个人对第五种个性化输出时间比较有兴趣,基本上只要项目中能用到都是使用第五种,推荐给小伙伴们。
javascript中,new Date()得到的是一个国际化时间格式的时间值这在我们使用中文的时候,很不方便,也很难看所以就需要对javascript中的日期时间进行格式化.
代码如下:function DateUtil(){}/***功能:格式化时间*示例:DateUtil.Format(“yyyy/MM/dd”,”Thu Nov 9 20:30:37 UTC+0800 2006 “);*返回:2006/11/09*/DateUtil.Format=function(fmtCode,date){ var ...
javascript的TRIM函数和日期时间格式化函数 如 var d = new Date().format('yyyy-MM-dd hh:mm:ss');
javascript 精确计算、日期处理、金额格式化
js通用日期格式化工具,直接引用该工具类就可以使用,方便快捷,建议大家收藏此工具类,该工具很好的解决了前端页面显示日期格式问题
感谢某前辈写的JS格式化日期和时间JS代码,很好很强大!!! 前言: js虽然提供了各种获取时间Date对象的不同属性方法,如:getDate 方法 | getDay 方法 | getFullYear 方法 | getHours 方法 … … 等等,但是却...
这是一个Javascript版的仿PHP时间格式化函数,使用方法和PHP语言一样,有丰富的模板字符串,替换更自由
本文给大家汇总介绍了javascript格式化日期时间的几种常用方法,个人对最后一种个性化输出时间比较有兴趣,基本上只要项目中能用到都是使用这种,推荐给小伙伴们。
javascript中Date format(js日期格式化)方法小结.docx
JavaScript中时间格式化新思路toLocaleString() 目录 1、时间格式化常规思路2、时间格式化toLocaleString() 1、时间格式化常规思路 2、时间格式化toLocaleString() 研究Object对象的时候,看到了 ...