关于jQuery插件jTemplate中时间转换的问题
用过jTemplate的人可能都知道如果有时间类型的值在返回的数据中(json), 时间会是/Date(1364478769713)/这样显示的,于是我们有了各种方法来规避这个看不懂的时间。 方法一: 使用设置参数的方法,具体代码如下: $("#result").setParam('DateFormat', DateFormat); function DateFormat(p_date) { var date = new Date(parseInt(p_date.replace("/Date(", "").replace(")/", ""), 10)); var month = date.getMonth() + 1 < 10 ? "0" + (date.getMonth() + 1) : date.getMonth() + 1; var currentDate = date.getDate() < 10 ? "0" + date.getDate() : date.getDate(); return date.getFullYear() + "/" + month + "/" + currentDate; } 在代码中使用,如下:{$P.DateFormat($T.Item.StartTime)} 方法二: 直接修改jTemplate的源码,具体代码如下: 大概在 行 104-106 之间添加: //set handlers 设置处理函数时,添加自己的处理函数 this.f_cloneData = (this.settings.f_cloneData !== undefined) ? (this.settings.f_cloneData) : (TemplateUtils.cloneData); this.f_escapeString = (this.settings.f_escapeString !== undefined) ? (this.settings.f_escapeString) : (TemplateUtils.escapeHTML); this.f_parseJSON = (this.settings.f_parseJSON !== undefined) ? (this.settings.f_parseJSON) : ((this.settings.disallow_functions) ? (jQuery.parseJSON) : (TemplateUtils.parseJSON)); this.f_timeConvert = (this.settings.f_timeConvert !== undefined) ? (this.settings.f_timeConvert) : (TemplateUtils.timeConvert); if (s == null) { return; } 在 行319-323 之间添加: /** * Process template and get the html string. * @param {object} d data * @param {object} param parameters * @param {Element} element a HTML element * @param {Number} deep * @return {String} */ Template.prototype.get = function (d, param, element, deep) { ++deep; if (deep == 1 && element != undefined) { jQuery.removeData(element, "jTemplatesRef"); } /*添加了对/Date(...)/时间的转换*/ this.f_timeConvert(d); var $T = d, $P, ret = ''; //create clone of data if (this.settings.clone_data) { $T = this.f_cloneData(d, { escapeData: (this.settings.filter_data && deep == 1), noFunc: this.settings.disallow_functions }, this.f_escapeString); } //create clone of parameters if (!this.settings.clone_params) { $P = jQuery.extend({}, this._param, param); } else { $P = jQuery.extend({}, this.f_cloneData(this._param, { escapeData: (this.settings.filter_params), noFunc: false }, this.f_escapeString), this.f_cloneData(param, { escapeData: (this.settings.filter_params && deep == 1), noFunc: false }, this.f_escapeString)); } for (var i = 0, l = this._tree.length; i < l; ++i) { ret += this._tree[i].get($T, $P, element, deep); } this.EvalObj = null; --deep; return ret; }; 在 行367 TemplateUtils定义之后添加timeConvert方法 /** * Template utilities. * @namespace Template utilities. */ TemplateUtils = function () { }; /** * ConvertTime to normal, * 使用递归, * 对所有出现的/Date(1364478769713)/都转换 * */ var regTime = /^\/Date\(/; TemplateUtils.timeConvert = function (obj) { for (var i in obj) { if (regTime.test(obj[i])) { obj[i] = (new Date(parseInt(obj[i].replace("/Date(", "").replace(")/", ""), 10))).format("yyyy/MM/dd"); //这里出现了一个 format("yyyy/MM/dd") 方法,在后边有说明 } else { if (typeof (obj[i]) === "object") { TemplateUtils.timeConvert(obj[i]); } } } }; //---------Date.prototype.format--------------------// /*这里有个小问题(BUG) 如果毫秒是 SSS,只显示2位数,留给大家修改, 我只提示一下在“00”+o[k] 那个地方有点小问题哦~*/ /** * 对时间进行格式化的方法, * 使用例子:(new Date()).format("yyyy/MM/dd"); */ Date.prototype.format = function (format) { var o = { "M+": this.getMonth() + 1, //month "d+": this.getDate(), //day "h+": this.getHours(), //hour "m+": this.getMinutes(), //minute "s+": this.getSeconds(), //second "q+": Math.floor((this.getMonth() + 3) / 3), //quarter "S+": this.getMilliseconds() //millisecond }; if (/(y+)/.test(format)) format = format.replace(RegExp.$1, (this.getFullYear() + "").substr(4 - RegExp.$1.length)); for (var k in o) if (new RegExp("(" + k + ")").test(format)) format = format.replace(RegExp.$1, RegExp.$1.length == 1 ? o[k] : ("00" + o[k]).substr(("" + o[k]).length)); return format; };