zoukankan      html  css  js  c++  java
  • JS 日期格式化和解析工具

    本来想模仿Java里面的SimpleDateFormat()对象的,但是感觉这样用起来不方便,所以还是直接写成单独的方法算了。

    原文链接

    日期格式化

    使用说明

    formatDate(date, fmt),其中fmt支持的格式有:

    • y(年)
    • M(月)
    • d(日)
    • q(季度)
    • w(星期)
    • H(24小时制的小时)
    • h(12小时制的小时)
    • m(分钟)
    • s(秒)
    • S(毫秒)

    另外,字符的个数决定输出字符的长度,如,yy输出16,yyyy输出2016,ww输出周五,www输出星期五,等等。

    代码

    完整代码一共30行:

    /**
     * 将日期格式化成指定格式的字符串
     * @param date 要格式化的日期,不传时默认当前时间,也可以是一个时间戳
     * @param fmt 目标字符串格式,支持的字符有:y,M,d,q,w,H,h,m,S,默认:yyyy-MM-dd HH:mm:ss
     * @returns 返回格式化后的日期字符串
     */
    function formatDate(date, fmt)
    {
        date = date == undefined ? new Date() : date;
        date = typeof date == 'number' ? new Date(date) : date;
        fmt = fmt || 'yyyy-MM-dd HH:mm:ss';
        var obj =
        {
            'y': date.getFullYear(), // 年份,注意必须用getFullYear
            'M': date.getMonth() + 1, // 月份,注意是从0-11
            'd': date.getDate(), // 日期
            'q': Math.floor((date.getMonth() + 3) / 3), // 季度
            'w': date.getDay(), // 星期,注意是0-6
            'H': date.getHours(), // 24小时制
            'h': date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 12小时制
            'm': date.getMinutes(), // 分钟
            's': date.getSeconds(), // 秒
            'S': date.getMilliseconds() // 毫秒
        };
        var week = ['天', '一', '二', '三', '四', '五', '六'];
        for(var i in obj)
        {
            fmt = fmt.replace(new RegExp(i+'+', 'g'), function(m)
            {
                var val = obj[i] + '';
                if(i == 'w') return (m.length > 2 ? '星期' : '周') + week[val];
                for(var j = 0, len = val.length; j < m.length - len; j++) val = '0' + val;
                return m.length == 1 ? val : val.substring(val.length - m.length);
            });
        }
        return fmt;
    }

    使用示例

    formatDate(); // 2016-09-02 13:17:13
    formatDate(new Date(), 'yyyy-MM-dd'); // 2016-09-02
    // 2016-09-02 第3季度 星期五 13:19:15:792
    formatDate(new Date(), 'yyyy-MM-dd 第q季度 www HH:mm:ss:SSS');
    formatDate(1472793615764); // 2016-09-02 13:20:15

    日期解析

    说明

    parseDate(str, fmt),其中fmt支持的格式有:

    • y(年)
    • M(月)
    • d(日)
    • H(24小时制的小时)
    • h(12小时制的小时)
    • m(分钟)
    • s(秒)
    • S(毫秒)

    完整代码

    完整代码共17行:

    /**
     * 将字符串解析成日期
     * @param str 输入的日期字符串,如'2014-09-13'
     * @param fmt 字符串格式,默认'yyyy-MM-dd',支持如下:y、M、d、H、m、s、S,不支持w和q
     * @returns 解析后的Date类型日期
     */
    function parseDate(str, fmt)
    {
        fmt = fmt || 'yyyy-MM-dd';
        var obj = {y: 0, M: 1, d: 0, H: 0, h: 0, m: 0, s: 0, S: 0};
        fmt.replace(/([^yMdHmsS]*?)(([yMdHmsS])3*)([^yMdHmsS]*?)/g, function(m, $1, $2, $3, $4, idx, old)
        {
            str = str.replace(new RegExp($1+'(\d{'+$2.length+'})'+$4), function(_m, _$1)
            {
                obj[$3] = parseInt(_$1);
                return '';
            });
            return '';
        });
        obj.M--; // 月份是从0开始的,所以要减去1
        var date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
        if(obj.S !== 0) date.setMilliseconds(obj.S); // 如果设置了毫秒
        return date;
    }

    示例代码

    parseDate('2016-08-11'); // Thu Aug 11 2016 00:00:00 GMT+0800
    parseDate('2016-08-11 13:28:43', 'yyyy-MM-dd HH:mm:ss') // Thu Aug 11 2016 13:28:43 GMT+0800

    其它日期相关方法

    其它自己还简单封装了几个方法,这里干脆一起贴出来了,包括上面的:

    /**
     * =====================================
     *               日期相关方法
     * =====================================
     */
    ;(function($)
    {
        $.extend(
        {
            /**
             * 将日期格式化成指定格式的字符串
             * @param date 要格式化的日期,不传时默认当前时间,也可以是一个时间戳
             * @param fmt 目标字符串格式,支持的字符有:y,M,d,q,w,H,h,m,S,默认:yyyy-MM-dd HH:mm:ss
             * @returns 返回格式化后的日期字符串
             */
            formatDate: function(date, fmt)
            {
                date = date == undefined ? new Date() : date;
                date = typeof date == 'number' ? new Date(date) : date;
                fmt = fmt || 'yyyy-MM-dd HH:mm:ss';
                var obj =
                {
                    'y': date.getFullYear(), // 年份,注意必须用getFullYear
                    'M': date.getMonth() + 1, // 月份,注意是从0-11
                    'd': date.getDate(), // 日期
                    'q': Math.floor((date.getMonth() + 3) / 3), // 季度
                    'w': date.getDay(), // 星期,注意是0-6
                    'H': date.getHours(), // 24小时制
                    'h': date.getHours() % 12 == 0 ? 12 : date.getHours() % 12, // 12小时制
                    'm': date.getMinutes(), // 分钟
                    's': date.getSeconds(), // 秒
                    'S': date.getMilliseconds() // 毫秒
                };
                var week = ['天', '一', '二', '三', '四', '五', '六'];
                for(var i in obj)
                {
                    fmt = fmt.replace(new RegExp(i+'+', 'g'), function(m)
                    {
                        var val = obj[i] + '';
                        if(i == 'w') return (m.length > 2 ? '星期' : '周') + week[val];
                        for(var j = 0, len = val.length; j < m.length - len; j++) val = '0' + val;
                        return m.length == 1 ? val : val.substring(val.length - m.length);
                    });
                }
                return fmt;
            },
            /**
             * 将字符串解析成日期
             * @param str 输入的日期字符串,如'2014-09-13'
             * @param fmt 字符串格式,默认'yyyy-MM-dd',支持如下:y、M、d、H、m、s、S,不支持w和q
             * @returns 解析后的Date类型日期
             */
            parseDate: function(str, fmt)
            {
                fmt = fmt || 'yyyy-MM-dd';
                var obj = {y: 0, M: 1, d: 0, H: 0, h: 0, m: 0, s: 0, S: 0};
                fmt.replace(/([^yMdHmsS]*?)(([yMdHmsS])3*)([^yMdHmsS]*?)/g, function(m, $1, $2, $3, $4, idx, old)
                {
                    str = str.replace(new RegExp($1+'(\d{'+$2.length+'})'+$4), function(_m, _$1)
                    {
                        obj[$3] = parseInt(_$1);
                        return '';
                    });
                    return '';
                });
                obj.M--; // 月份是从0开始的,所以要减去1
                var date = new Date(obj.y, obj.M, obj.d, obj.H, obj.m, obj.s);
                if(obj.S !== 0) date.setMilliseconds(obj.S); // 如果设置了毫秒
                return date;
            },
            /**         * 将一个日期格式化成友好格式,比如,1分钟以内的返回“刚刚”,         * 当天的返回时分,当年的返回月日,否则,返回年月日         * @param{Object} date         */
            formatDateToFriendly: function(date)
            {
                date = date || new Date();
                date = typeof date === 'number' ? new Date(date) : date;
                var now = new Date();
                if((now.getTime() - date.getTime()) < 60*1000) return '刚刚'; // 1分钟以内视作“刚刚”
                var temp = this.formatDate(date, 'yyyy年M月d');
                if(temp == this.formatDate(now, 'yyyy年M月d')) return this.formatDate(date, 'HH:mm');
                if(date.getFullYear() == now.getFullYear()) return this.formatDate(date, 'M月d日');
                return temp;
            },
            /**         * 将一段时长转换成友好格式,如:         * 147->“2分27秒”         * 1581->“26分21秒”         * 15818->“4小时24分”         * @param{Object} second         */
            formatDurationToFriendly: function(second)
            {
                if(second < 60) return second + '秒';
                else if(second < 60*60) return (second-second%60)/60+'分'+second%60+'秒';
                else if(second < 60*60*24) return (second-second%3600)/60/60+'小时'+Math.round(second%3600/60)+'分';
                return (second/60/60/24).toFixed(1)+'天';
            },
            /**          * 将时间转换成MM:SS形式          */
            formatTimeToFriendly: function(second)
            {
                var m = Math.floor(second / 60);
                m = m < 10 ? ( '0' + m ) : m;
                var s = second % 60;
                s = s < 10 ? ( '0' + s ) : s;
                return m + ':' + s;
            },
            /**         * 判断某一年是否是闰年         * @paramyear 可以是一个date类型,也可以是一个int类型的年份,不传默认当前时间         */
            isLeapYear: function(year)
            {
                if(year === undefined) year = new Date();
                if(year instanceof Date) year = year.getFullYear();
                return (year % 4 == 0 && year % 100 != 0) || (year % 400 == 0);
            },
            /**         * 获取某一年某一月的总天数,没有任何参数时获取当前月份的         * 方式一:$.getMonthDays();         * 方式二:$.getMonthDays(new Date());         * 方式三:$.getMonthDays(2013, 12);         */
            getMonthDays: function(date, month)
            {
                var y, m;
                if(date == undefined) date = new Date();
                if(date instanceof Date)
                {
                    y = date.getFullYear();
                    m = date.getMonth();
                }
                else if(typeof date == 'number')
                {
                    y = date;
                    m = month-1;
                }
                var days = [31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31]; // 非闰年的一年中每个月份的天数
                //如果是闰年并且是2月
                if(m == 1 && this.isLeapYear(y)) return days[m]+1;
                return days[m];
            },
            /**         * 计算2日期之间的天数,用的是比较毫秒数的方法         * 传进来的日期要么是Date类型,要么是yyyy-MM-dd格式的字符串日期         * @paramdate1 日期一         * @paramdate2 日期二         */
            countDays: function(date1, date2)
            {
                var fmt = 'yyyy-MM-dd';
                // 将日期转换成字符串,转换的目的是去除“时、分、秒”
                if(date1 instanceof Date && date2 instanceof Date)
                {
                    date1 = this.format(fmt, date1);
                    date2 = this.format(fmt, date2);
                }
                if(typeof date1 === 'string' && typeof date2 === 'string')
                {
                    date1 = this.parse(date1, fmt);
                    date2 = this.parse(date2, fmt);
                    return (date1.getTime() - date2.getTime()) / (1000*60*60*24);
                }
                else
                {
                    console.error('参数格式无效!');
                    return 0;
                }
            }
        });
    })(jQuery);
  • 相关阅读:
    Codevs 2296 仪仗队 2008年省队选拔赛山东
    Codevs 1535 封锁阳光大学
    Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组
    Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
    Codevs 1684 垃圾陷阱
    洛谷 P1108 低价购买
    Vijos P1325桐桐的糖果计划
    Codevs 3289 花匠 2013年NOIP全国联赛提高组
    Codevs 2611 观光旅游(floyed最小环)
    C语言基础之彩色版C语言(内含linux)
  • 原文地址:https://www.cnblogs.com/libin-1/p/5836083.html
Copyright © 2011-2022 走看看