通用时间轴解析: 刚刚 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>