201 lines
3.8 KiB
JavaScript
201 lines
3.8 KiB
JavaScript
// yyyy-MM-dd hh:mm:ss.SSS 所有支持的类型
|
||
function pad(str, length = 2) {
|
||
str += ''
|
||
while (str.length < length) {
|
||
str = '0' + str
|
||
}
|
||
return str.slice(-length)
|
||
}
|
||
|
||
const parser = {
|
||
yyyy: (dateObj) => {
|
||
return pad(dateObj.year, 4)
|
||
},
|
||
yy: (dateObj) => {
|
||
return pad(dateObj.year)
|
||
},
|
||
MM: (dateObj) => {
|
||
return pad(dateObj.month)
|
||
},
|
||
M: (dateObj) => {
|
||
return dateObj.month
|
||
},
|
||
dd: (dateObj) => {
|
||
return pad(dateObj.day)
|
||
},
|
||
d: (dateObj) => {
|
||
return dateObj.day
|
||
},
|
||
hh: (dateObj) => {
|
||
return pad(dateObj.hour)
|
||
},
|
||
h: (dateObj) => {
|
||
return dateObj.hour
|
||
},
|
||
mm: (dateObj) => {
|
||
return pad(dateObj.minute)
|
||
},
|
||
m: (dateObj) => {
|
||
return dateObj.minute
|
||
},
|
||
ss: (dateObj) => {
|
||
return pad(dateObj.second)
|
||
},
|
||
s: (dateObj) => {
|
||
return dateObj.second
|
||
},
|
||
SSS: (dateObj) => {
|
||
return pad(dateObj.millisecond, 3)
|
||
},
|
||
S: (dateObj) => {
|
||
return dateObj.millisecond
|
||
},
|
||
}
|
||
|
||
// 这都n年了iOS依然不认识2020-12-12,需要转换为2020/12/12
|
||
function getDate(time) {
|
||
if (time instanceof Date) {
|
||
return time
|
||
}
|
||
switch (typeof time) {
|
||
case 'string':
|
||
{
|
||
// 2020-12-12T12:12:12.000Z、2020-12-12T12:12:12.000
|
||
if (time.indexOf('T') > -1) {
|
||
return new Date(time)
|
||
}
|
||
return new Date(time.replace(/-/g, '/'))
|
||
}
|
||
default:
|
||
return new Date(time)
|
||
}
|
||
}
|
||
|
||
export function formatDate(date, format = 'yyyy/MM/dd hh:mm:ss') {
|
||
if (!date && date !== 0) {
|
||
return ''
|
||
}
|
||
date = getDate(date)
|
||
const dateObj = {
|
||
year: date.getFullYear(),
|
||
month: date.getMonth() + 1,
|
||
day: date.getDate(),
|
||
hour: date.getHours(),
|
||
minute: date.getMinutes(),
|
||
second: date.getSeconds(),
|
||
millisecond: date.getMilliseconds()
|
||
}
|
||
const tokenRegExp = /yyyy|yy|MM|M|dd|d|hh|h|mm|m|ss|s|SSS|SS|S/
|
||
let flag = true
|
||
let result = format
|
||
while (flag) {
|
||
flag = false
|
||
result = result.replace(tokenRegExp, function(matched) {
|
||
flag = true
|
||
return parser[matched](dateObj)
|
||
})
|
||
}
|
||
return result
|
||
}
|
||
|
||
export function friendlyDate(time, {
|
||
locale = 'zh',
|
||
threshold = [60000, 3600000],
|
||
format = 'yyyy/MM/dd hh:mm:ss'
|
||
}) {
|
||
if (time === '-') {
|
||
return time
|
||
}
|
||
if (!time && time !== 0) {
|
||
return ''
|
||
}
|
||
const localeText = {
|
||
zh: {
|
||
year: '年',
|
||
month: '月',
|
||
day: '天',
|
||
hour: '小时',
|
||
minute: '分钟',
|
||
second: '秒',
|
||
ago: '前',
|
||
later: '后',
|
||
justNow: '刚刚',
|
||
soon: '马上',
|
||
template: '{num}{unit}{suffix}'
|
||
},
|
||
en: {
|
||
year: 'year',
|
||
month: 'month',
|
||
day: 'day',
|
||
hour: 'hour',
|
||
minute: 'minute',
|
||
second: 'second',
|
||
ago: 'ago',
|
||
later: 'later',
|
||
justNow: 'just now',
|
||
soon: 'soon',
|
||
template: '{num} {unit} {suffix}'
|
||
}
|
||
}
|
||
const text = localeText[locale] || localeText.zh
|
||
let date = getDate(time)
|
||
let ms = date.getTime() - Date.now()
|
||
let absMs = Math.abs(ms)
|
||
if (absMs < threshold[0]) {
|
||
return ms < 0 ? text.justNow : text.soon
|
||
}
|
||
if (absMs >= threshold[1]) {
|
||
return formatDate(date, format)
|
||
}
|
||
let num
|
||
let unit
|
||
let suffix = text.later
|
||
if (ms < 0) {
|
||
suffix = text.ago
|
||
ms = -ms
|
||
}
|
||
const seconds = Math.floor((ms) / 1000)
|
||
const minutes = Math.floor(seconds / 60)
|
||
const hours = Math.floor(minutes / 60)
|
||
const days = Math.floor(hours / 24)
|
||
const months = Math.floor(days / 30)
|
||
const years = Math.floor(months / 12)
|
||
switch (true) {
|
||
case years > 0:
|
||
num = years
|
||
unit = text.year
|
||
break
|
||
case months > 0:
|
||
num = months
|
||
unit = text.month
|
||
break
|
||
case days > 0:
|
||
num = days
|
||
unit = text.day
|
||
break
|
||
case hours > 0:
|
||
num = hours
|
||
unit = text.hour
|
||
break
|
||
case minutes > 0:
|
||
num = minutes
|
||
unit = text.minute
|
||
break
|
||
default:
|
||
num = seconds
|
||
unit = text.second
|
||
break
|
||
}
|
||
|
||
if (locale === 'en') {
|
||
if (num === 1) {
|
||
num = 'a'
|
||
} else {
|
||
unit += 's'
|
||
}
|
||
}
|
||
|
||
return text.template.replace(/{\s*num\s*}/g, num + '').replace(/{\s*unit\s*}/g, unit).replace(/{\s*suffix\s*}/g,
|
||
suffix)
|
||
}
|