js 把字符串格式化成时间


一 需求

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 (中国标准时间)

如果有别的实现,欢迎留言给我,谢谢~


免责声明!

本站转载的文章为个人学习借鉴使用,本站对版权不负任何法律责任。如果侵犯了您的隐私权益,请联系本站邮箱yoyou2525@163.com删除。



 
粤ICP备18138465号  © 2018-2025 CODEPRJ.COM