时间转换

作者: 超爱吃小龙虾 | 来源:发表于2018-03-20 19:51 被阅读0次

    该组件适用于以下场景

    1,将时间戳转换成时间显示,支持年,月,日,天,分,秒,毫秒,可以定义自己想要的格式来显示,比如2018-03-20 18:20/2018/03/20 19:20

    2,将时间转换成时间戳显示,

    3,获取两个时间的时间差

    4,在日前前面加上0,比如:2018-3-12  => 2018-03-12

    js源码


    let ts = 1000 * 60 * 60 * 24;  let xs = 1000 * 60 * 60;  let fz = 1000 * 60;  let hm = 1000;  let date_list = {}; // 缓存数据

    /**

    * [setTime 获取时间差]

    * @param {[时间格式]} start [开始时间]

    * @param {[(可为空)时间格式]} end  [结束时间]

    * @param {[(可为空)数值]} poor  [差(毫秒)]

    */

    function setTime(start, end, poor) {

        let m = 0;

        let _key = start + '_' + end;

        /** [if 检查相对应‘毫秒差’是否已存在缓存中,不存在则获取数据并缓存] */

        if (!date_list[_key]) {

             if (typeof end === 'undefined') { m = start * 1;

                    if (!m && m != 0) {m = examine(start).getTime(); }

               } else { m = examine(end).getTime() - examine(start).getTime(); // 日期时间格式 } 

            date_list[_key] = m;

        } else {  m = date_list[_key]; }

        m = m - ((m >= 0 ? poor : -poor) || 0);

        let _data = { day: '0', // 天  hour: '00', // 小时   min: '00', // 分钟 sec: '00', // 秒 base: m || 0 // 毫秒 };

        /** 开始计算 */

        m = Math.abs(m);

        if (m > 0) { let day = (m / ts) >> 0;   let hour = ((m - day * ts) / xs) >> 0;   let min = ((m - day * ts - hour * xs) / fz) >> 0;

            let sec = ((m - day * ts - hour * xs - min * fz) / hm) >> 0;

            _data.day = patchZero(day, _data.day.length);

            _data.hour = patchZero(hour, _data.hour.length);

            _data.min = patchZero(min, _data.min.length);

            _data.sec = patchZero(sec, _data.sec.length); }

        return _data; }

    /**

    * [examine 转换日期]

    * @param  {[]} str [支持时间戳、时间格式、Date]

    * @return {[Date]}    [Date]

    */

    function examine(str) {

        try {  let _date;

            /** [if 判断是否已经为时间对象] */

            if (typeof str === 'object' && typeof str.getTime === 'function') {   return str;   }

            /** [if 判断是否为时间戳格式] */

            if (str >> 0) {

                if ((str).toString().length == 10) {  str = str * 1000;  } else { str = str * 1;  }

            } else {

                /** 为了兼容坑爹的ios */

                str = str.replace(/-/g, '/');

            }

            /** [if 是否不为空] */

            if (str && str != '0') {

                _date = new Date(str);

                if (_date == 'Invalid Date') {  console.warn('日期格式错误:', str);  }

                 else { return _date;  }

            } else {  console.warn('不能为空!');    }

        } catch (err) {  console.warn(err);  }

    }

    /**

    * [getDate 获取相对应的年月日等]

    * @param  {[时间]} date [时间戳、时间格式字符串、]

    * @param  {[字符串]} fmt  [编号成的时间格式,第一个为!时]

    * @return {[对象]}      [description]

    */

    function getDate(date, fmt = '!y-M-d h:m:s.S') {

        let _date = examine(date);

        if (_date) {   let _regfun;

            let o = {   'y': _date.getFullYear(), // 年份   'M': _date.getMonth() + 1, // 月份  'd': _date.getDate(), // 日   'h': _date.getHours(), // 小时

                'm': _date.getMinutes(), // 分  's': _date.getSeconds(), // 秒   'q': Math.floor((_date.getMonth() + 3) / 3), // 季度

                'S': _date.getMilliseconds() // 毫秒 };

            if (fmt.charAt(0) === '!') {  _regfun = patchZero; fmt = fmt.slice(1);

                } else { _regfun = function (a, l) {   return ('00000' + a).slice(-l); };

            }

            for (let k in o) {

                if (new RegExp('(' + k + '+)').test(fmt)) {  fmt = fmt.replace(  RegExp.$1, _regfun(o[k], RegExp.$1.length)  ); }

            }

            o.fmt = fmt;

            return o;  }

    }

    /**

    * [patchZero 前面加0]

    * @param  {[type]} a [description]

    * @param  {[type]} l [description]

    * @return {[type]}  [description]

    */

    function patchZero(a, l) {

        for (let i = (a).toString().length; i < l; i++) {  a = '0' + a; };

        return a;

    }

    module.exports = {

        setTime: setTime,  // 获取时间差

        getDate: getDate,  // 获取相对应的年月日等

        patchZero: patchZero, // 前面加0

        examine: examine  // 转换日期

    };


    后续应该会直接给个git链接的,现在现在简书上练练手,不太怎么会写文章,之后能力有所提升的话,会在git上分享更多,更深的东西


    示例

    js命名为timeDeal.js

    import getDate from './timeDeal'

    const currentData = +new Date(); // 获取当前时间戳

    const time = getDate( currentData  , 'yyyy.M.dd hh:mm').fmt

    相关文章

      网友评论

        本文标题:时间转换

        本文链接:https://www.haomeiwen.com/subject/fqsrqftx.html