123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200 |
- // 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)
- }
|