一 需求
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 (中國標准時間)
如果有別的實現,歡迎留言給我,謝謝~