skyouc
2024-12-21 c9c263dc43ad90f95f24a036cee9e6b47afb596c
uni_modules/uni-dateformat/components/uni-dateformat/date-format.js
@@ -1,200 +1,200 @@
// 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)
}
// 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)
}