格式化時間戳

/**
 * @fileOverview 彩票項目中使用各種基礎函數(shù)
 * @name q.core.js 基礎函數(shù)(字符串,日期,cookie)
 * @author chengbingsheng@#
 * @version 0.0.1
 */
/**
 *
 *@module Q_core
 * 提供基礎功能函數(shù)
 */
define(['underscore'], function(_) {
    //使用嚴格模式
    "use strict"
    //定義Q對象,定義二級對象
    var Q_core = {
        version : '0.0.1',
        time_stamp : +new Date(),
        noop : function() {
        },
        system : {}, ///一些瀏覽器通用內(nèi)容
        number : {}, //數(shù)字計算相關
        date : {}, //日期時間相關
        string : {}, //字符串相關
        cookie : {} //cookie相關
    };
    /**************************************************************************************************************
     *@ignore Q_core.system
     ***************************************************************************************************************/
    /**
     * @property is_mobile
     * @description 檢測系統(tǒng)是否手機,簡單,不嚴謹
     */
    Q_core.system.is_mobile = ( function() {
            var UA = window.navigator.userAgent;
            var len = UA.length;
            var l = UA.replace(/iphone|ipad mini|ipad|ipod|android|Series60|BlackBerry|Windows Phone/gi, '').length;
            return l !== len;
        }());
    /**************************************************************************************************************
     * @ignore Q_core.number
     ***************************************************************************************************************/

    /**
     * @description 格式化數(shù)字,小數(shù)位不足補0
     * @param {Number} num 被格式化的數(shù)字
     * @param {Number} [decimal=2]  小數(shù)位數(shù)
     * @param {Number} [round=0] 如何舍入 可選值為以下幾種:<br>1:只入不舍,<br>0:四舍五入,<br>-1:只舍不入 ,<br>465:四舍六入五留雙
     * @return {String} 字符串格式的數(shù)字 如:123.45
     * @example Q_core.number.format(123.456,2,1) <br> => 123.45
     * @method
     */
    Q_core.number.format = function(num, decimal, round) {
        var pow;
        decimal = typeof (decimal * 1) !== 'number' || isNaN(decimal * 1) ? 2 : Math.abs(decimal);
        pow = Math.pow(10, decimal);
        num *= 1;
        //f_num處理浮點數(shù)問題,能保證保留10位小數(shù)以內(nèi)計算得到正常結果
        var f_num = 0.000000000099999;
        switch (round) {
        case 1:
            num = Math.ceil(num * pow) / pow;
            break;
        case -1:
            num = Math.floor(num * pow + f_num) / pow;
            break;
        case 465:
            //四舍六入五成雙,如保留兩位小數(shù),第三位小數(shù)如果是5,則看第二位是奇偶,如果是奇,則進位,否則舍去
            var is_jo = Math.floor(num * pow + f_num) % 10 % 2;
            //要進位上數(shù)字是否是5
            var is_five = Math.floor(num * pow * 10 + f_num) % 10 == 5;
            var step = is_five && !is_jo ? 1 / pow : 0;
            num = Q_core.number.format(num, decimal) - step;
            break;
        default:
            num = (num * pow + f_num) / pow;
        }
        return (num.toFixed(decimal) + '').replace(/^\./g, '0.').replace(/\.$/, '');
    };
    /**
     * @description 把數(shù)字格式化成貨幣型
     * @param {Number} num 被格式化的數(shù)字
     * @param {Number} [decimal=2] 小數(shù)位  默認兩位
     * @param {Number} [round=0]  如何舍入 可選值為以下幾種:<br>1:只入不舍,0:四舍五入,-1:只舍不入
     * @return {String} 貨幣格式的字符串型的數(shù)字  如:1,234,567.46
     * @example Q_core.number.currency(1234567.456,2,0)=>1,234,567.46
     *  @method
     */
    Q_core.number.currency = function(num, decimal, round) {
        var arr;
        if ( typeof decimal !== 'undefined') {
            num = Q_core.number.format(num, decimal, round);
        }
        arr = (num + '').split('.');
        arr[0] = arr[0].replace(/(\d)(?=(\d{3})+$)/g, '$1,');
        return (arr[0] + (arr.length == 2 ? '.' + arr[1] : '')).replace(/^\./g, '0.');
    };

    /**
     * @description 單位數(shù)字前補0
     * @param {Number} s 數(shù)字或者字符串
     * @return {String} 01-09
     * @example Q_core.number.fillZero('1') => 01
     *  @method
     */
    Q_core.number.fillZero = function(s){
        if(typeof s !== 'number' && typeof s !== 'string') return false;
        if(typeof s !== 'string') {
            var n = Number(s);
        }else{
            var n = s;
        }
        return n>9 ? n : '0' + n;
    }

    /**
     * @description 格式成百分比,根據(jù)參數(shù)來格式化一個數(shù)的百分比或是千分比等
     * @param {Number} num 被格式化的數(shù)字【必選】
     * @param {Number} [percent=100] 比率,如100則是百分比,1000則是千分比,默認百分比
     * @param {Number} [decimal=2] 小數(shù)位,默認兩位
     * @param {Number} [round=0] 如何舍入可選值為:1 只入不舍,0 四舍五入,-1 只舍不入
     * @return {String} 百分比,不帶% 如:65
     * @example Q_core.number.format(1/3,100,2,0) <br> => 33
     * @method
     */
    Q_core.number.percent = function(num, percent, decimal, round) {
        return Q_core.number.format(num * 1 * (percent || 100), decimal, round);
    };
    /**
     * @description 求組合數(shù),從m個項中選出n個項的無序排列數(shù)
     * @param {Number} m 總項數(shù)【必選】
     * @param {Number} n 選出的項數(shù)【必選】
     * @return {Number} 組合數(shù)
     * @example Q_core.number.combo(4,2) <br> => 6
     * @method
     */
    Q_core.number.combo = function(m, n) {
        var v1,
            v2;
        //combo(11,9)<br> =>combo(11,2)
        if (m / 2 < n) {
            n = m - n;
        }
        //處理m,n為負數(shù)
        if (m < n || n < 0) {
            return 0;
        }
        //處理combo(3,0)==1
        if (m >= 0 && n === 0) {
            return 1;
        }
        v1 = 1;
        v2 = m;
        for (var i = 1; i <= n; i++) {
            v1 *= i;
            if (i < n) {
                v2 *= (m - i);
            }
        }
        return v2 / v1;
    };
    /**
     * @description 遍歷所有組合項,從數(shù)組arr中選出numa項,采用遞歸,數(shù)據(jù)量太大時有性能問題
     * @param {Array} arr 所有項【必選】
     * @param {Number} num 選出的項數(shù)【必選】
     * @return {Array} 所有組合項的數(shù)組
     * @example Q_core.number.each_combo([1,2,3],2) <br>  <br> => ['12','13','23']
     * @method
     */
    Q_core.number.each_combo = function(arr, num) {
        var r = [];
        (function f(t, a, n) {
            if (n === 0) {
                return r.push(t);
            }
            for (var i = 0,
                l = a.length; i <= l - n; i++) {
                f(t.concat(a[i]), a.slice(i + 1), n - 1);
            }
        })([], arr, num);
        return r;
    };
    /**
     * @description 給定個二維數(shù)組,遍歷所有組合項
     * @param {Array} arr 二維數(shù)組  如:[[1,2,3],[4,5,6]]【必選】
     * @return {Array} 所有組合項的數(shù)組
     * @example Q_core.number.each_array_combo([[1,2,3],[4,5,6]]) <br>  <br> =>[[1,4],[1,5,[1,6],[2,4],[2,5],[2,6],[3,4],[3,5],[3,6]]
     * @method
     */
    Q_core.number.each_array_combo = function(arr) {
        var idx = 0;
        var len = arr.length;
        var result = [];
        var tmp;
        var tmpArr = [];
        tmpArr.push(arr);
        (function each(arr) {
            var tmpArr = [];
            for (var i = 0,
                l = arr.length; i < l; i++) {
                for (var j = 0,
                    jl = arr[i][idx].length; j < jl; j++) {
                    tmp = [].concat(arr[i]);
                    tmp.splice(idx, 1, arr[i][idx][j]);
                    tmpArr.push(tmp);
                }
            }
            idx++;
            if (idx < len) {
                each(tmpArr);
            } else {
                result = tmpArr;
                return;
            }
        })(tmpArr);
        return result;
    };
    /**
     * @description 求排列數(shù) ,從m個項中選出n個項的有序排列數(shù)
     * @param {Bumber} m 總項數(shù)【必選】
     * @param {Number} n 選出的項數(shù)【必選】
     * @return {Number} 排列數(shù)
     * @example Q_core.number.permutation(4,2) <br> => 12
     * @method
     */
    Q_core.number.permutation = function(m, n) {
        var v = 1;
        if (m < n || n < 0) {
            return 0;
        }
        for (var i = 0; i < n; i++) {
            v *= (m - i);
        }
        return v;
    };
    /**
     * @description 遍歷所有排列項,從數(shù)組arr中選出numa項,采用遞歸,數(shù)據(jù)量太大時有性能問題
     * @param {Array} arr 所有項【必選】
     * @param {Number} num 選出的項數(shù)【必選】
     * @return {Array} 所有排列項數(shù)組
     * @example Q_core.number.each_permutation([1,2,3],2) <br> => ['12','13','21','23','31','32']
     * @method
     */
    Q_core.number.each_permutation = function(arr, num) {
        var r = [];
        (function f(t, a, n) {
            if (n === 0) {
                return r.push(t);
            }
            for (var i = 0,
                l = a.length; i < l; i++) {
                f(t.concat(a[i]), a.slice(0, i).concat(a.slice(i + 1)), n - 1);
            }
        })([], arr, num);
        return r;
    };
    /**
     * @description 從自然數(shù)n-m的范圍隨機選出k組z個數(shù),主要用于彩票中的隨機選號
     * @param {Object} options 對象參數(shù)
     * @param {Number} options.min 范圍最小值
     * @param {Number} options.max 范圍最大值
     * @param {Number} options.size 隨機的個數(shù)
     * @param {Array} [options.share] 膽碼,如果指定,隨機每一組里都包含該數(shù)組內(nèi)的元素【可選】
     * @param {Array} [options.shahao] 殺號,如果指定,隨機每一組里都不會包含該數(shù)組內(nèi)的元素【可選】
     * @param {Number} [options.count=1] 隨機的組數(shù),一組是options.size個默認為一組【可選】
     * @param {Boolean} [options.repeat=false] 是否可以重復 默認不重復【可選】
     * @param {Boolean} [options.sort=false] 是否排序 默認不排序【可選】
     * @param {Boolean} [options.repeat_team=true] 如果是一組時,組內(nèi)是否可以重復,默認可以【可選】
     * @return {Array} 如:[[1,3,4],[3,4,6]]
     * @example  Q_core.number.random({min:0,max:9,size:3,count:2}) <br> => [[1,3,4],[3,4,6]]
     * @method
     */
    Q_core.number.random = function(options_p) {
        var options = {
            min : 0,
            max : 9,
            share : [],
            shahao : [],
            size : 1
        };
        $.extend(options, options_p);
        options.count = options.count || 1;
        var one_random = function(options) {
            var ar,
                tmp,
                k = 0,
                ml,
                l;
            var pre_str = '0000000000000000';
            ml = (options.max + '').length;
            ar = (options.share || []).toString();
            ar = ar === '' ? [] : ar.split(/[,\-_=+\|]/);
            l = ar.length;
            if (l > 0 && options.max > 9) {//有膽且為兩位數(shù)以上,前面補零
                for (var i = 0; i < l; i++) {
                    if (ar[i].length < ml) {
                        ar[i] = pre_str.substr(0, ml - ar[i].length) + ar[i];
                    }
                }
            }
            while (k < options.size) {
                tmp = (Math.floor(Math.random() * (options.max - options.min + 1)) + options.min) + '';
                tmp = pre_str.substr(0, ml - tmp.length) + tmp;
                if (options.repeat || (!options.repeat) && $.inArray(tmp, ar) == -1 && $.inArray(tmp, options.shahao || []) == -1) {
                    ar.push(tmp);
                    k++;
                }
            }
            if (!!options.sort) {
                ar.sort();
            }
            return typeof options.split_str !== 'undefined' ? ar.join(options.split_str) : ar;
        };
        var result = [];
        var count = Q_core.number.combo(options.max - options.min + 1 - options.share.length - options.shahao.length, options.size);
        if (count < options.count) {
            options.repeat_team = 1;
        }
        for (var i = 0; i < options.count; i++) {
            var re_tmp = one_random(options);
            if (!options.repeat_team) {
                var re_len = result.length;
                var flag = 0;
                for (var j = 0; j < re_len; j++) {
                    if (result[j].toString() == re_tmp.toString()) {
                        flag = 1;
                        break;
                    }
                }
                if (flag) {
                    i--;
                } else {
                    result.push(re_tmp);
                }
            } else {
                result.push(re_tmp);
            }
        }
        return result;
    };
    /**
     * @description 檢測用戶按下是否是方向健
     * @param {Array} e 事件對象
     * @return  {Boolean} true/false
     * @method
     */

    Q_core.number.pass_key = function(e) {
        return $.inArray(e.keyCode, [8, 16, 17, 37, 38, 39, 40, 46, 67]) >= 0;
    };
    /**
     * @description 檢測號碼是否為連號
     * @param  {Array} arr 待檢測的數(shù)組
     * @param  {Number} [step=1] 步長
     * @return {Boolean} true/false
     * @example Q_core.number.is_seq([1,2,3]) <br> => true <br>
     * Q_core.number.is_seq([1,3,5],2) <br> => true
     * @method
     */
    Q_core.number.is_seq = function(arr, step) {
        var arr_tmp = [].concat(arr);
        step = step || 1;
        //去重
        arr_tmp = _.unique(arr_tmp);
        var len = arr.length;
        var len_new = arr_tmp.length;
        var result = false;
        if (len == len_new) {
            arr_tmp.sort(function(a, b) {
                return a - b
            });
            result = (arr_tmp[len - 1] - arr_tmp[0]) / step + 1 == len;
        }
        return result;
    }
    /**************************************************************************************************************
     *Q_core.date
     ***************************************************************************************************************/
    /**
     * @description 把日期對象格式化字符串格式
     * @param {Date/Number} date 時期對象或由Date.getTime()得到的時間數(shù)【必選】
     * @param {String} [format_style=YYYY-MM-DD hh:mm:ss] 格式化樣式
     * 可自定義。YYYY四位年份,YY兩位年分,MM月份,DD天,hh小時,mm分種,ss秒
     * @return {String} 格式化后的字符串
     * @example Q_core.date.format(new Date()) <br> => 2015-03-16 12:33:30
     * @method
     */
    Q_core.date.format = function(date, format_style) {
        date = typeof date == 'object' ? date : new Date(date * 1);
        format_style = format_style || 'YYYY-MM-DD hh:mm:ss';
        var YYYY = date.getFullYear();
        var MM = date.getMonth() + 1;
        var DD = date.getDate();
        var hh = date.getHours();
        var mm = date.getMinutes();
        var ss = date.getSeconds();
        var YY = (YYYY + '').replace(/^\d\d/g, '');
        MM = MM < 10 ? '0' + MM : MM;
        DD = DD < 10 ? '0' + DD : DD;
        hh = hh < 10 ? '0' + hh : hh;
        mm = mm < 10 ? '0' + mm : mm;
        ss = ss < 10 ? '0' + ss : ss;
        return Q_core.string.mul_replace(format_style, [[/YYYY/, YYYY], [/YY/, YY], [/MM/, MM], [/DD/, DD], [/hh/, hh], [/mm/, mm], [/ss/, ss]]);
    };
    /**
     * @description 把日期字符串轉(zhuǎn)成日期對象
     * @param {String} dateStr 時期字符串,如:20110612, 像2011-6-12 12:15:20會直接調(diào)用系統(tǒng)函數(shù)處理【必選】
     * @return {Date} 轉(zhuǎn)化后時間對象
     * @example Q_core.date.to_date('20110909')
     * @method
     */
    Q_core.date.to_date = function(dateStr) {
        dateStr = $.trim(dateStr);
        var str = dateStr;
        var reg = /.*(\d{4})(\d\d)(\d\d).*/;
        //如果是純數(shù)字組合,并且有連續(xù)的8位數(shù)字
        if ($.isNumeric(dateStr) && reg.test(dateStr)) {
            str = dateStr.replace(reg, '$1-$2-$3');
        }
        return new Date(str);
    };

    /**
     * @description 獲取日期在星期中的周幾
     * @param {String} dateStr 時期字符串,只支持8位純數(shù)字日期或國內(nèi)日期格式,如2011-06-12 2011/06/12【必選】
     * @param {Number} [flag=0] 標記返回的數(shù)據(jù)類型 ,為0:返回文本周幾,為1:返回周幾的下標:為2:返回文本和下標['周二',2]
     * @return {String} 返回日期所在的周幾
     * @example Q_core.date.get_week("20150316") <br> => 周一
     * @method
     */
    Q_core.date.get_week = function(dateStr, flag) {
        var date = Q_core.date.to_date(dateStr);
        flag = flag || 0;
        var wi = date.getDay();
        var weeks = '周' + ["日", "一", "二", "三", "四", "五", "六"][wi];
        var result = flag == 0 ? weeks : flag == 1 ? wi : [weeks, wi];
        return result;
    };
    /**************************************************************************************************************
     *Q_core.string
     ***************************************************************************************************************/
    /**
     * @description 計算字符串長度,中文字符算兩個
     * @param {String} str 字符串【必選】
     * @return {Number} 字符串的長度
     * @example Q_core.string.len('adf2asd中國') <br> => 9
     * @method
     */
    Q_core.string.len = function(str) {
        return str.replace(/[^\x00-\xff]/g, "--").length;
    };
    /**
     * @description 從字符串截取指定的長度,中文字符算兩個,如果取到中文之符一半,則舍掉這個中文
     * @param {String} str 被截取的字符串【必選】
     * @param {Number} len 要截取的長度【必選】
     * @param {String} [ext] 超過指定長度后的后綴,默認為空【可選】
     * @return {String} 截取后的字符串
     * @example Q_core.string.cut('adf2asd中國',5,'') <br> => adf2a
     */
    Q_core.string.cut = function(str, len, ext) {
        ext = ext || '';
        if (Q_core.string.len(str) <= len - ext.length) {
            return str;
        }
        len -= ext.length;
        //雙字節(jié)字符替換成兩個//去掉臨界雙字節(jié)字符//還原
        return str.substr(0, len).replace(/([^\x00-\xff])/g, "$1 ").substr(0, len).replace(/[^\x00-\xff]$/, "").replace(/([^\x00-\xff]) /g, "$1") + ext;
    };
    /**
     * @description 取得URL中指定參數(shù)的值,簡易版,復雜情況下沒做考慮,如,多個同名參數(shù),參數(shù)又是一個URL等
     * @param {String} name 參數(shù)名字符串,如果帶#則取hash中的值【必選】
     * @param {String} [url] URL【可選】 默認為當前頁面的URL
     * @return {String} 指定參數(shù)的值
     * @example Q_core.string.get_url_param('par','http://mm.cn?par=test') <br> => test
     * @method
     */
    Q_core.string.get_url_param = function(name, url) {
        var m,
            reg,
            tmp;
        url = (url || window.location.href).toLowerCase().split('#');
        if (name.indexOf('#') != -1) {
            tmp = url.length < 2 ? '' : url[1];
        } else {
            tmp = url[0];
        }
        m = tmp.match(new RegExp('(|[?&#])' + name.replace('#', '') + '=([^#&?]*)(\\s||$)', 'gi'));
        if (m) {
            return decodeURIComponent(m[0].split('=')[1]);
        } else {
            return '';
        }
    };
    /**
     * @description 批量替換
     * @param {String} str 被替換的字符串 【必選】
     * @param {Array} arr 替換規(guī)則 【必選】
     * @return {String} 替換后的字符串
     * @example Q_core.string.mul_replace('test',[['t','h'],['st','llo']]) <br> => hello;
     * @method
     */
    Q_core.string.mul_replace = function(str, arr) {
        for (var i = 0,
            l = arr.length; i < l; i++) {
            str = str.replace(arr[i][0], arr[i][1]);
        }
        return str;
    };
    /**
     * @description 把全角數(shù)字,空格,句號轉(zhuǎn)換成半角
     * @param {String} str 被轉(zhuǎn)換的字符串 【必選】
     * @return {Stirng} 替換后的字符串
     * @example Q_core.string.dbc_to_sbc('3') <br> => 3
     * @method
     */
    Q_core.string.dbc_to_sbc = function(str) {
        return Q_core.string.mul_replace(str, [[/[\uff01-\uff5e]/g,
        function(a) {
            return String.fromCharCode(a.charCodeAt(0) - 65248);
        }], [/\u3000/g, ' '], [/\u3002/g, '.']]);
    };
    /**************************************************************************************************************
     *Q_core.cookie
     ***************************************************************************************************************/
    /**
     * @description 得到指定的cookie值
     * @param {String} name cookie名稱【必選】
     * @param {Boolean} [encode] 是否encodeURIComponent 默認false【可選】
     * @return 指定cookie的值
     * @example Q_core.cookie.get('name')
     * @method
     */
    Q_core.cookie.get = function(name, encode) {
        var m = document.cookie.match(new RegExp("(^| )" + name + "=([^;])*", "gi")),
            v = !m ? '' : m[0].split(name + '=')[1];
        return (!!encode ? v : decodeURIComponent(v));
    };
    /**
     * @description set設置cookie, del刪除cookie,當expires小于0時即為刪除cookie
     * @param {Object} options 【必選】
     * @param {String} options.name cookie的名稱【必選】
     * @param {String} options.value cookie的值【必選】
     * @param {Number} [options.expires] cookie的過期時間,為整數(shù),單位為天,為負時刪除cookie【可選】
     * @param {String} [options.domain]  指定cookie所屬的域【可選】
     * @param {String} [options.path]  指定cookie 的路徑【可選】
     * @param {Boolean} [options.secure]  是否安全傳輸 當協(xié)議為https時才可用【可選】
     * @param {Boolean} [options.encode]  是否對值進行encodeURIComponent【可選】
     * @example Q_core.cookie.set({name:'test',value:'ok'});
     * @method
     */
    Q_core.cookie.set = Q_core.cookie.del = function(options) {
        var ck = [];
        ck.push(options.name + '=');
        if (options.value) {
            ck.push(!!options.encode ? options.value : encodeURIComponent(options.value));
            //是否encodeURIComponent
        }
        if (options.expires) {
            var d = new Date();
            d.setHours(0);
            d.setMinutes(0);
            d.setSeconds(0);
            d.setTime(d.getTime() + options.expires * 86400000);
            //24 * 60 * 60 * 1000
            ck.push(';expires=' + d.toGMTString());
        }
        if (options.domain) {
            ck.push(';domain=' + options.domain);
        }
        ck.push(';path=' + (options.path || '/'));
        if (options.secure) {
            ck.push(';secure');
        }
        document.cookie = ck.join('');
    };
    //**************************************************************************************************************
    return Q_core;
});

最后編輯于
?著作權歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務。

相關閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容