由於長期的項目積累,本身寫了一些計算時間的插件,相比較momoent,我以爲比它好用this
const ONE_DAY = 86400000 const ensureLength = function (num) { // 補全時間YYY-MM-dd HH:MM:ss let nlen = num.toString().length num = nlen < 2 ? '0' + num : num return num } const isUndefined = function (s) { return s === undefined || s === null || s === '' } const _DateUtils = { parse (dateStr) { if (dateStr instanceof Date) { return dateStr } else if (/^\d+$/.test(dateStr)) { return new Date(parseInt(dateStr, 10)) } else if (dateStr) { let dateString = dateStr.replace(/[-:]/g, ',').replace(/\s+/g, ',') let dateArr = dateString.split(',') return new Date(dateArr[0], dateArr[1] - 1, dateArr[2], dateArr[3] || 0, dateArr[4] || 0, dateArr[5] || 0) } else if (!dateStr) { return dateStr } }, toDateString (date, tpl) { let locals if (isUndefined(date)) { date = new Date() } if (isUndefined(tpl)) { tpl = 'yyyy-MM-dd' } date = this.parse(date) locals = { yyyy: date.getFullYear(), YYYY: date.getFullYear(), MM: ensureLength(date.getMonth() + 1), dd: ensureLength(date.getDate()), HH: ensureLength(date.getHours()), mm: ensureLength(date.getMinutes()), ss: ensureLength(date.getSeconds()) } return tpl.replace(/YYYY|yyyy|MM|dd|HH|mm|ss/g, function ($1) { return locals[$1] }) }, toTimeString (date, tpl) { let locals if (isUndefined(date)) { date = new Date() } if (isUndefined(tpl)) { tpl = 'HH:mm:ss' } locals = { HH: ensureLength(date.getHours()), mm: ensureLength(date.getMinutes()), ss: ensureLength(date.getSeconds()) } return tpl.replace(/HH|mm|ss/g, function ($1) { return locals[$1] }) }, toDateTimeString (date) { date = date || new Date() date = this.parse(date) return this.toDateString(date) + ' ' + this.toTimeString(date) }, getFirstDate (date) { date = date || new Date() date = this.parse(date) let fitsrDate = new Date(date.getFullYear(), date.getMonth(), 1) return this.toDateString(fitsrDate) }, getLastDate (date) { date = this.parse(date) let nextMonthFirstDate = (new Date(date.getFullYear(), date.getMonth() + 1, 1)).getTime() let lastDate = new Date(nextMonthFirstDate - ONE_DAY) return this.toDateString(lastDate) }, toMonthString (date) { let month if (isUndefined(date)) { date = new Date() } date = this.parse(date) month = ensureLength(date.getMonth() + 1) return (date.getFullYear()) + '-' + month }, getPreMonth (date) { let month, year if (isUndefined(date)) { date = new Date() } date = this.parse(date) year = date.getFullYear() month = ensureLength(date.getMonth()) year = month === '00' ? year - 1 : year month = month === '00' ? '12' : month return year + '-' + month }, getPreMonthDay (today) { if (isUndefined(today)) { today = new Date() } return this.toDateString(today.setMonth(today.getMonth() - 1)) }, ago (cnt) { let day = new Date().getDate() return new Date().setDate(day - cnt) }, getCurrentWeek () { let now = new Date() let currentDay = now.getDay() let start = this.ago(currentDay - 1) let end = now return [start, end] }, getRecentMonths (cnt) { /* params{ cnt : '月',往後推幾個月 } */ if (isUndefined(cnt)) { cnt = 0 } cnt = parseInt(cnt) let now = new Date() let currentMonth = now.getMonth() let year = now.getFullYear() let start let agoMonth = currentMonth - cnt > 0 ? currentMonth - cnt : currentMonth - cnt + 12 let agoYear = currentMonth - cnt > 0 ? year : year - 1 start = new Date(agoYear, agoMonth, 1) let end = new Date() return [start, end] }, getCurrentQ () { let now = new Date() let currentMonth = now.getMonth() let start if (currentMonth < 3) { start = now.setMonth(0) } else if (currentMonth > 3 && currentMonth < 6) { start = now.setMonth(3) } else if (currentMonth > 2 && currentMonth < 6) { start = now.setMonth(6) } else if (currentMonth > 8 && currentMonth < 11) { start = now.setMonth(9) } start = new Date(start).setDate(1) let end = new Date() return [start, end] } } /* params:{ parse(格式化日期), toDateString(把時間戳只取日期部分,精確到天), toTimeString(把時間戳只取時間部分,精確到秒), toDateTimeString(把時間戳轉化爲字符串形式,精確到秒), getFirstDate(取月份第一天,精確到天), getLastDate(取月份最後一天,精確到天), toMonthString(月份轉化爲字符串), getPreMonth(取上月份,精確到月), getPreMonthDay(取上一月,精確到天), ago(前第n天,精確到天), getRecentMonths(最近幾個月,從1號開始) getCurrentQ(最近一個季度,從1號開始) } */ export default _DateUtils