对Javascript中Date日期的扩展,主要是对Date对象扩展了一个格式化日期和解析日期的方法。

/**
 * 日期解析器
 * @param value
 * @param format
 * @return {Date}
 */
Date.prototype.parser = function(value,format) {

    var shortMonthsToNumber = [];
    shortMonthsToNumber["Jan"] = "01";
    shortMonthsToNumber["Feb"] = "02";
    shortMonthsToNumber["Mar"] = "03";
    shortMonthsToNumber["Apr"] = "04";
    shortMonthsToNumber["May"] = "05";
    shortMonthsToNumber["Jun"] = "06";
    shortMonthsToNumber["Jul"] = "07";
    shortMonthsToNumber["Aug"] = "08";
    shortMonthsToNumber["Sep"] = "09";
    shortMonthsToNumber["Oct"] = "10";
    shortMonthsToNumber["Nov"] = "11";
    shortMonthsToNumber["Dec"] = "12";

    var parseMonth = function (value) {
        return shortMonthsToNumber[value] || value;
    };

    var padding = function(value, length) {
        var paddingCount = length - String(value).length;
        for(var i = 0 ; i < paddingCount ; i++) {
            value = "0" + value;
        }
        return value;
    };

    var parseTime = function (value) {
        var retValue = value;
        var millis = "";
        if (retValue.indexOf(".") !== -1) {
            var delimited = retValue.split('.');
            retValue = delimited[0];
            millis = delimited[1];
        }

        var values3 = retValue.split(":");

        if (values3.length > 0) {
            var hour = 0,minute = 0,second = 0,millis = 0;
            var hour = values3[0];
            if(values3[1]){
                minute = values3[1];
            }
            if(values3[2]){
                second = values3[2];
            }

            return {
                time: retValue,
                hour: hour,
                minute: minute,
                second: second,
                millis: millis
            };
        } else {
            return {
                time: "",
                hour: "",
                minute: "",
                second: "",
                millis: ""
            };
        }
    };

    var resultDate = new Date(1970, 01, 01, 00, 00, 00);
    if(!value){
        return resultDate;
    }

    try {

        var date = null;
        var year = null;
        var month = null;
        var dayOfMonth = null;
        var time = null;
        if (typeof value == "number"){
            return this.date(new Date(value), format);
        } else if (typeof value.getFullYear == "function") {
            year = value.getFullYear();
            month = value.getMonth() + 1;
            dayOfMonth = value.getDate();
            time = parseTime(value.toTimeString());
        } else if (value.search(/\d{4}-\d{2}-\d{2}T\d{2}:\d{2}:\d{2}\.?\d{0,3}[Z\-+]?(\d{2}:?\d{2})?/) != -1) {
            /* 2009-04-19T16:11:05+02:00 || 2009-04-19T16:11:05Z */
            var values = value.split(/[T\+-]/);
            year = values[0];
            month = values[1];
            dayOfMonth = values[2];
            time = parseTime(values[3].split(".")[0]);
            date = new Date(year, month - 1, dayOfMonth);
        } else {
            var values = value.split(" ");
            switch (values.length) {
                case 6:
                    /* Wed Jan 13 10:43:41 CET 2010 */
                    year = values[5];
                    month = parseMonth(values[1]);
                    dayOfMonth = values[2];
                    time = parseTime(values[3]);
                    date = new Date(year, month - 1, dayOfMonth);
                    break;
                case 2:
                    /* 2009-12-18 10:54:50.546 */
                    var values2 = values[0].split("-");
                    year = values2[0];
                    month = values2[1];
                    dayOfMonth = values2[2];
                    time = parseTime(values[1]);
                    date = new Date(year, month - 1, dayOfMonth);
                    break;
                case 7:
                /* Tue Mar 01 2011 12:01:42 GMT-0800 (PST) */
                case 9:
                /* Fri Apr 08 2011 00:00:00 GMT+0800 (China Standard Time) */
                case 10:
                    /* Fri Apr 08 2011 00:00:00 GMT+0200 (W. Europe Daylight Time) */
                    year = values[3];
                    month = parseMonth(values[1]);
                    dayOfMonth = values[2];
                    time = parseTime(values[4]);
                    date = new Date(year, month - 1, dayOfMonth);
                    break;
                case 1:
                    /* 2012-02-07CET00:00:00 */
                    var values2 = values[0].split("");
                    if(values2.length > 3){
                        year=values2[0]+values2[1]+values2[2]+values2[3];
                    }
                    if(values2.length > 6){
                        month= values2[5]+values2[6];
                    }
                    if(values2.length > 9){
                        dayOfMonth = values2[8]+values2[9];
                    }
                    if(values2.length > 20){
                        time = parseTime(values2[13]+values2[14]+values2[15]+values2[16]+values2[17]+values2[18]+values2[19]+values2[20]);
                    }
                    if(Number(dayOfMonth) && Number(month) && Number(dayOfMonth)){
                        date = new Date(year, month - 1, dayOfMonth);
                    }else {
                        return new Date();
                    }
                    break;
                default:
                    return new Date();
            }
        }

        var pattern = "";
        if(!format){
            format = "yyyy-MM-dd HH:mm:ss";
        }
        for (var i = 0; i < format.length; i++) {
            var currentPattern = format.charAt(i);
            pattern += currentPattern;
            switch (pattern) {
                case "D":
                case "ddd":
                    pattern = "";
                    break;
                case "dd"://月中的某一天。一位数的日期有一个前导零。
                    if (format.charAt(i + 1) == "d") {
                        break;
                    }
                    resultDate.setDate(Number(padding(dayOfMonth, 2)));
                    pattern = "";
                    break;
                case "d"://月中的某一天。一位数的日期没有前导零。
                    if (format.charAt(i + 1) == "d") {
                        break;
                    }
                    resultDate.setDate(parseInt(dayOfMonth, 10));
                    pattern = "";
                    break;
                case "MMMM"://月份的完整名称,在   MonthNames   中定义。
                case "MMM"://月份的缩写名称,在   AbbreviatedMonthNames   中定义。
                    pattern = "";
                    break;
                case "MM"://月份数字。一位数的月份有一个前导零。
                    if (format.charAt(i + 1) == "M") {
                        break;
                    }
                    resultDate.setMonth(Number(padding(month, 2))-1, 1);
                    pattern = "";
                    break;
                case "M"://月份数字。一位数的月份没有前导零。
                    if (format.charAt(i + 1) == "M") {
                        break;
                    }
                    resultDate.setMonth(parseInt(month, 10)-1, 1);
                    pattern = "";
                    break;
                case "y"://不包含纪元的年份。不具有前导零。
                case "yyy":
                    if (format.charAt(i + 1) == "y") {
                        break;
                    }
                    pattern = "";
                    break;
                case "yy"://不包含纪元的年份。具有前导零。
                    if (format.charAt(i + 1) == "y" &&
                        format.charAt(i + 2) == "y") {
                        break;
                    }
                    resultDate.setFullYear(Number('19'+String(year).slice(-2)), 1, 1);
                    pattern = "";
                    break;
                case "yyyy"://包括纪元的四位数的年份。
                    resultDate.setFullYear(Number(year), 1, 1);
                    pattern = "";
                    break;
                case "HH"://24   小时制的小时。一位数的小时数有前导零。
                    resultDate.setHours(Number(padding(time.hour, 2)));
                    pattern = "";
                    break;
                case "H"://24   小时制的小时。一位数的小时数没有前导零。
                    if (format.charAt(i + 1) == "H") {
                        break;
                    }
                    resultDate.setHours(parseInt(time.hour, 10));
                    pattern = "";
                    break;
                case "hh"://12   小时制的小时。一位数的小时数有前导零。
                    var hour = (time.hour == 0 ? 12 : time.hour < 13 ? time.hour : time.hour - 12);
                    resultDate.setHours(Number(padding(hour, 2)));
                    pattern = "";
                    break;
                case "h"://12   小时制的小时。一位数的小时数没有前导零。
                    if (format.charAt(i + 1) == "h") {
                        break;
                    }
                    var hour = (time.hour == 0 ? 12 : time.hour < 13 ? time.hour : time.hour - 12);
                    resultDate.setHours(parseInt(hour, 10));
                    pattern = "";
                    break;
                case "mm"://将分钟显示为带前导零的数字
                    resultDate.setMinutes(Number(padding(time.minute,2)));
                    pattern = "";
                    break;
                case "m"://将分钟显示为不带前导零的数字
                    if (format.charAt(i + 1) == "m") {
                        break;
                    }
                    resultDate.setMinutes(Number(time.minute));
                    pattern = "";
                    break;
                case "ss"://将秒显示为带前导零的数字
                    resultDate.setSeconds(Number(padding(time.second.substring(0, 2), 2)));
                    pattern = "";
                    break;
                case "s"://将秒显示为不带前导零的数字
                    if (format.charAt(i + 1) == "s") {
                        break;
                    }
                    resultDate.setSeconds(Number(time.second));
                    pattern = "";
                    break;
                default:
                    pattern = "";
                    break;
            }
        }
        return resultDate;
    } catch(e) {
        if(window.console){
            console.error(e);
        }
        return resultDate;
    }

}

 

标签: JavaScript, Date扩展

添加新评论