返回列表

通用时间轴解析: 刚刚 2分钟前 1小时前 1天前 4月5日 2017年11月03日

默认分类 2018/06/01 02:17

通用时间轴解析: 刚刚 2分钟前 1小时前 1天前 4月5日 2017年11月03日

<!DOCTYPE html>
<html lang="en">
<head>
  <meta charset="UTF-8">
  <title>Document</title>
</head>
<body>
  <div id="out"></div>
  <script>
      // now 5m 30m 1h yestday lastyear
      'use strict'
      var hui = {}
      /**
       * @method hui.parseTimeline
       * @description 时间轴:刚刚 2-59分钟前 1-23小时前 1-3天前 4月5日 2017年11月03日
       * @param {String} tt 目标时间
       * @param {String} now 当前时间
       */
      hui.parseTimeline = function (tt, now){
        if (!tt || !tt.getTime) tt = hui.parseDate(tt)
        if (!now) now = new Date()
        else if (!now.getTime) now = hui.parseDate(now)

        var dd = now.getTime() - tt.getTime()
        if (dd < 0) return ''
        if (dd < 2 * 60 * 1000) return '刚刚'
        if (dd < 60 * 60 * 1000) return parseInt(dd/60/1000) + '分钟前'
        if (dd < 24 * 60 * 60 * 1000) return parseInt(dd/60/60/1000) + '小时前'
        if (dd < 4 * 24 * 60 * 60 * 1000) return parseInt(dd/24/60/60/1000) + '天前'
        if (now.getFullYear() == tt.getFullYear()) return hui.formatDate(tt, 'M月d日')
        return hui.formatDate(tt, 'yyyy年MM月dd日')
      }
      /**
       * @method hui.formatDate
       * @description 将Date类型解析为String类型. 
       * @param {Date} date 输入的日期
       * @param {String} fmt 输出日期格式
       * @example
       * hui.formatDate(new Date(2006,0,1), 'yyyy-MM-dd HH:mm')
       */
      hui.formatDate = function(date, fmt) {
        if (!date) date = new Date()
        fmt = fmt || 'yyyy-MM-dd HH:mm:ss'
        var o = {
          'M+': date.getMonth() + 1, //月份      
          'd+': date.getDate(), //日      
          'h+': date.getHours() % 12 === 0 ? 12 : date.getHours() % 12, //小时      
          'H+': date.getHours(), //小时      
          'm+': date.getMinutes(), //分      
          's+': date.getSeconds(), //秒      
          'q+': Math.floor((date.getMonth() + 3) / 3), //季度      
          'S': date.getMilliseconds() //毫秒      
        }
        var week = {
          '0': '/u65e5',
          '1': '/u4e00',
          '2': '/u4e8c',
          '3': '/u4e09',
          '4': '/u56db',
          '5': '/u4e94',
          '6': '/u516d'
        }
        if (/(y+)/.test(fmt)) {
          fmt = fmt.replace(RegExp.$1, (date.getFullYear() + '').substr(4 - RegExp.$1.length))
        }
        if (/(E+)/.test(fmt)) {
          fmt = fmt.replace(RegExp.$1, ((RegExp.$1.length > 1) ? (RegExp.$1.length > 2 ? '/u661f/u671f' : '/u5468') : '') + week[date.getDay() + ''])
        }
        for (var k in o) {
          if (o.hasOwnProperty(k) && new RegExp('(' + k + ')').test(fmt)) {
            fmt = fmt.replace(RegExp.$1, (RegExp.$1.length == 1) ? (o[k]) : (('00' + o[k]).substr(('' + o[k]).length)))
          }
        }
        return fmt
      }

      /**
       * @method hui.parseDate
       * @description 将String类型解析为Date类型.  
       * @param {String} fmt 输入的字符串格式的日期
       * @example
       * parseDate('2006-1-1') return new Date(2006,0,1)  
       * parseDate(' 2006-1-1 ') return new Date(2006,0,1)  
       * parseDate('2006-1-1 15:14:16') return new Date(2006,0,1,15,14,16)  
       * parseDate(' 2006-1-1 15:14:16 ') return new Date(2006,0,1,15,14,16);  
       * parseDate('不正确的格式') retrun null  
       */
      hui.parseDate = function(str) {
        str = String(str).replace(/^[\s\xa0]+|[\s\xa0]+$/ig, '')
        var results = null

        //秒数 #9744242680 
        results = str.match(/^ *(\d{10}) *$/)
        if (results && results.length > 0)
          return new Date(parseInt(str, 10) * 1000)

        //毫秒数 #9744242682765 
        results = str.match(/^ *(\d{13}) *$/)
        if (results && results.length > 0)
          return new Date(parseInt(str, 10))

        //20110608 
        results = str.match(/^ *(\d{4})(\d{2})(\d{2}) *$/)
        if (results && results.length > 3)
          return new Date(parseInt(results[1], 10), parseInt(results[2], 10) - 1, parseInt(results[3], 10))

        //20110608 1010 
        results = str.match(/^ *(\d{4})(\d{2})(\d{2}) +(\d{2})(\d{2}) *$/)
        if (results && results.length > 5)
          return new Date(parseInt(results[1], 10), parseInt(results[2], 10) - 1, parseInt(results[3], 10), parseInt(results[4], 10), parseInt(results[5], 10))

        //2011-06-08 
        results = str.match(/^ *(\d{4})[\._\-\/\\](\d{1,2})[\._\-\/\\](\d{1,2}) *$/)
        if (results && results.length > 3)
          return new Date(parseInt(results[1], 10), parseInt(results[2], 10) - 1, parseInt(results[3], 10))

        //2011-06-08 10:10 
        results = str.match(/^ *(\d{4})[\._\-\/\\](\d{1,2})[\._\-\/\\](\d{1,2}) +(\d{1,2}):(\d{1,2}) *$/)
        if (results && results.length > 5)
          return new Date(parseInt(results[1], 10), parseInt(results[2], 10) - 1, parseInt(results[3], 10), parseInt(results[4], 10), parseInt(results[5], 10))

        //2011/06\\08 10:10:10 
        results = str.match(/^ *(\d{4})[\._\-\/\\](\d{1,2})[\._\-\/\\](\d{1,2}) +(\d{1,2}):(\d{1,2}):(\d{1,2}) *$/)
        if (results && results.length > 6)
          return new Date(parseInt(results[1], 10), parseInt(results[2], 10) - 1, parseInt(results[3], 10), parseInt(results[4], 10), parseInt(results[5], 10), parseInt(results[6], 10))

        return (new Date(str))
      }

  </script>
</body>
</html>