一 需求
js里面的Date.parse() 方法接收字符串,返回一个时间,但是接收的字符串格式缺不能指定,这很蛋疼,这样就有了浏览器差异,所以需要一个可以指定字符串格式的方法,将时间字符串转化为时间
二 分析
难点在于占位符个数的问题,需要格式字符串和时间字符串完全的匹配才可以,这样就限制了功能,但是目前我还没想到什么办法来解决这个问题,只能做一个初步的实现,满足我基本的需求
三 代码
/**
* 根据formatter字符串转换时间字符串
* 月(M)、日(d)、小时(h)、分(m)、秒(s) 占位符个数需要和时间字符串匹配
* @param {string} dateStr 时间字符串 如:"2015-11-12"
* @param {string} fmt 格式化字符串 如:"yyyy-MM-dd"
* @return {Date} 标准时间
* author: shaojiasong 2015-12-29
*/
function parseDate(dateStr,fmt){
if(!dateStr || !fmt || (dateStr.length != fmt.length)) {
throw new Error("转换时间时发生错误,时间字符串与格式字符串不匹配!");
}
//排除特殊字符,避免正则发生错误
fmt = fmt.replace(/([\^\$\.\*\+\?\=\!\:\|\\\/\(\)\[\]\{\}])/ig,"\\$1");
function getReg(str){
var cfmt = fmt;
cfmt = cfmt.replace(new RegExp(str+"+","g"),function(full){ return "("+full+")";}) || "";
return cfmt.replace(/[yMdhmsS]/g,"\\d");
}
var year = parseInt((new RegExp(getReg("y")).exec(dateStr)[1])) || 0;
var month = parseInt((new RegExp(getReg("M")).exec(dateStr)[1])) - 1 || 0;
var day = parseInt((new RegExp(getReg("d")).exec(dateStr)[1])) || 0;
var hour = parseInt((new RegExp(getReg("h")).exec(dateStr)[1])) || 0;
var minute = parseInt((new RegExp(getReg("m")).exec(dateStr)[1])) || 0;
var second = parseInt((new RegExp(getReg("s")).exec(dateStr)[1])) || 0;
return new Date(year,month,day,hour,minute,second);
}
用例
var mydate = parseDate("2015-11-12 12:25:30","yyyy-MM-dd hh:mm:ss"); //结果: Thu Nov 12 2015 12:25:30 GMT+0800 (中国标准时间)
如果有别的实现,欢迎留言给我,谢谢~