关于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;
};

 

posted @ 2013-03-28 22:33  标准小兵  阅读(566)  评论(0编辑  收藏  举报