一 需求
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 (中国标准时间)
如果有别的实现,欢迎留言给我,谢谢~