You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
197 lines
3.7 KiB
197 lines
3.7 KiB
// 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 && 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) |
|
}
|
|
|