UNPKG

yunser-ui-vue

Version:

material design ui for vue2

374 lines (345 loc) 10.8 kB
/** * material-ui dateUtils.js * https://github.com/callemall/material-ui/blob/master/src/DatePicker/dateUtils.js */ let localConfig = { dayAbbreviation: ['日', '一', '二', '三', '四', '五', '六'], dayList: ['星期日', '星期一', '星期二', '星期三', '星期四', '星期五', '星期六'], monthList: ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'], monthLongList: ['一月', '二月', '三月', '四月', '五月', '六月', '七月', '八月', '九月', '十月', '十一月', '十二月'] } export const dateTimeFormat = { formatDisplay (date) { var day = date.getDate() return `${localConfig.monthList[date.getMonth()]}-${day > 9 ? day : '0' + day} ${localConfig.dayList[date.getDay()]}` }, formatMonth (date) { return `${date.getFullYear()} ${localConfig.monthLongList[date.getMonth()]}` }, getWeekDayArray (firstDayOfWeek) { let beforeArray = [] let afterArray = [] const dayAbbreviation = localConfig.dayAbbreviation for (let i = 0; i < dayAbbreviation.length; i++) { if (i < firstDayOfWeek) { afterArray.push(dayAbbreviation[i]) } else { beforeArray.push(dayAbbreviation[i]) } } return beforeArray.concat(afterArray) } } export function getDaysInMonth (d) { const resultDate = getFirstDayOfMonth(d) resultDate.setMonth(resultDate.getMonth() + 1) resultDate.setDate(resultDate.getDate() - 1) return resultDate.getDate() } export function getFirstDayOfMonth (d) { return new Date(d.getFullYear(), d.getMonth(), 1) } export function getWeekArray (d, firstDayOfWeek) { const dayArray = [] const daysInMonth = getDaysInMonth(d) const weekArray = [] let week = [] for (let i = 1; i <= daysInMonth; i++) { dayArray.push(new Date(d.getFullYear(), d.getMonth(), i)) } const addWeek = (week) => { const emptyDays = 7 - week.length for (let i = 0; i < emptyDays; ++i) { week[weekArray.length ? 'push' : 'unshift'](null) } weekArray.push(week) } dayArray.forEach((day) => { if (week.length > 0 && day.getDay() === firstDayOfWeek) { addWeek(week) week = [] } week.push(day) if (dayArray.indexOf(day) === dayArray.length - 1) { addWeek(week) } }) return weekArray } export function addDays (d, days) { const newDate = cloneDate(d) newDate.setDate(d.getDate() + days) return newDate } export function addMonths (d, months) { const newDate = cloneDate(d) newDate.setMonth(d.getMonth() + months) return newDate } export function addYears (d, years) { const newDate = cloneDate(d) newDate.setFullYear(d.getFullYear() + years) return newDate } export function cloneDate (d) { return new Date(d.getTime()) } export function cloneAsDate (d) { const clonedDate = cloneDate(d) clonedDate.setHours(0, 0, 0, 0) return clonedDate } export function isBeforeDate (d1, d2) { const date1 = cloneAsDate(d1) const date2 = cloneAsDate(d2) return (date1.getTime() < date2.getTime()) } export function isAfterDate (d1, d2) { const date1 = cloneAsDate(d1) const date2 = cloneAsDate(d2) return (date1.getTime() > date2.getTime()) } export function isBetweenDates (dateToCheck, startDate, endDate) { return (!(isBeforeDate(dateToCheck, startDate)) && !(isAfterDate(dateToCheck, endDate))) } export function isEqualDate (d1, d2) { return d1 && d2 && (d1.getFullYear() === d2.getFullYear()) && (d1.getMonth() === d2.getMonth()) && (d1.getDate() === d2.getDate()) } export function monthDiff (d1, d2) { let m m = (d1.getFullYear() - d2.getFullYear()) * 12 m += d1.getMonth() m -= d2.getMonth() return m } export function yearDiff (d1, d2) { return ~~(monthDiff(d1, d2) / 12) } const MONTH_NAMES = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December', 'Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'] const DAY_NAMES = ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday', 'Sun', 'Mon', 'Tue', 'Wed', 'Thu', 'Fri', 'Sat'] /** * 日期对象转换为指定格式的字符串 * @param date Date日期对象, 如果缺省,则为当前时间 * @param f 日期格式,格式定义如下 yyyy-MM-dd HH:mm:ss * * YYYY/yyyy/YY/yy 表示年份 * MM/M 月份 * W/w 星期 * dd/DD/d/D 日期 * hh/HH/h/H 时间 * mm/m 分钟 * ss/SS/s/S 秒 * @return string 指定格式的时间字符串 */ export function dateToStr (date, formatStr) { formatStr = formatStr || 'yyyy-MM-dd' date = date || new Date() var str = formatStr str = str.replace(/yyyy|YYYY/, date.getFullYear()) str = str.replace(/yy|YY/, (date.getYear() % 100) > 9 ? (date.getYear() % 100).toString() : '0' + (date.getYear() % 100)) str = str.replace(/MM/, addZero(date.getMonth() + 1)) str = str.replace(/M/g, date.getMonth() + 1) str = str.replace(/w|W/g, localConfig.dayAbbreviation[date.getDay()]) str = str.replace(/dd|DD/, addZero(date.getDate())) str = str.replace(/d|D/g, date.getDate()) str = str.replace(/hh|HH/, addZero(date.getHours())) str = str.replace(/h|H/g, date.getHours()) str = str.replace(/mm/, addZero(date.getMinutes())) str = str.replace(/m/g, date.getMinutes()) str = str.replace(/ss|SS/, addZero(date.getSeconds())) str = str.replace(/s|S/g, date.getSeconds()) return str } export function strFormatToDate (val, format) { var iVal = 0 var iFormat = 0 var c = '' var token = '' var x, y var now = new Date() var year = now.getFullYear() var month = now.getMonth() + 1 var date = 1 var hh = now.getHours() var mm = now.getMinutes() var ss = now.getSeconds() var ampm = '' while (iFormat < format.length) { c = format.charAt(iFormat) token = '' while ((format.charAt(iFormat) === c) && (iFormat < format.length)) { token += format.charAt(iFormat++) } // Extract contents of value based on format token if (token === 'yyyy' || token === 'YYYY' || token === 'yy' || token === 'YY' || token === 'y' || token === 'Y') { if (token === 'yyyy' || token === 'YYYY') { x = 4 y = 4 } if (token === 'yy' || token === 'YY') { x = 2 y = 2 } if (token === 'y' || token === 'Y') { x = 2 y = 4 } year = getInt(val, iVal, x, y) if (year == null) { return 0 } iVal += year.length if (year.length === 2) { if (year > 70) { year = 1900 + (year - 0) } else { year = 2000 + (year - 0) } } } else if (token === 'MMM' || token === 'NNN') { month = 0 for (var i = 0; i < MONTH_NAMES.length; i++) { var monthName = MONTH_NAMES[i] if (val.substring(iVal, iVal + monthName.length).toLowerCase() === monthName.toLowerCase()) { if (token === 'MMM' || (token === 'NNN' && i > 11)) { month = i + 1 if (month > 12) { month -= 12 } iVal += monthName.length break } } } if ((month < 1) || (month > 12)) { return 0 } } else if (token === 'EE' || token === 'E') { for (let i = 0; i < DAY_NAMES.length; i++) { let dayName = DAY_NAMES[i] if (val.substring(iVal, iVal + dayName.length).toLowerCase() === dayName.toLowerCase()) { iVal += dayName.length break } } } else if (token === 'MM' || token === 'M') { month = getInt(val, iVal, token.length, 2) if (month == null || (month < 1) || (month > 12)) { return 0 } iVal += month.length } else if (token === 'dd' || token === 'd' || token === 'DD' || token === 'D') { date = getInt(val, iVal, token.length, 2) if (date === null || (date < 1) || (date > 31)) { return 0 } iVal += date.length } else if (token === 'hh' || token === 'h') { hh = getInt(val, iVal, token.length, 2) if (hh == null || (hh < 1) || (hh > 12)) { return 0 } iVal += hh.length } else if (token === 'HH' || token === 'H') { hh = getInt(val, iVal, token.length, 2) if (hh == null || (hh < 0) || (hh > 23)) { return 0 } iVal += hh.length } else if (token === 'KK' || token === 'K') { hh = getInt(val, iVal, token.length, 2) if (hh == null || (hh < 0) || (hh > 11)) { return 0 } iVal += hh.length } else if (token === 'kk' || token === 'k') { hh = getInt(val, iVal, token.length, 2) if (hh == null || (hh < 1) || (hh > 24)) { return 0 } iVal += hh.length hh-- } else if (token === 'mm' || token === 'm') { mm = getInt(val, iVal, token.length, 2) if (mm == null || (mm < 0) || (mm > 59)) { return 0 } iVal += mm.length } else if (token === 'ss' || token === 's' || token === 'SS' || token === 's') { ss = getInt(val, iVal, token.length, 2) if (ss == null || (ss < 0) || (ss > 59)) { return 0 } iVal += ss.length } else if (token === 'u') { let u = getInt(val, iVal, token.length, 3) if (u == null || (u < 0) || (u > 999)) { return 0 } iVal += u.length } else if (token === 'a') { if (val.substring(iVal, iVal + 2).toLowerCase() === 'am') { ampm = 'AM' } else if (val.substring(iVal, iVal + 2).toLowerCase() === 'pm') { ampm = 'PM' } else { return 0 } iVal += 2 } else { if (val.substring(iVal, iVal + token.length) !== token) { return 0 } else { iVal += token.length } } } // Is date valid for month? if (month === 2) { // Check for leap year if (((year % 4 === 0) && (year % 100 !== 0)) || (year % 400 === 0)) { // leap // year if (date > 29) { return 0 } } else { if (date > 28) { return 0 } } } if ((month === 4) || (month === 6) || (month === 9) || (month === 11)) { if (date > 30) { return 0 } } // Correct hours value if (hh < 12 && ampm === 'PM') { hh = hh - 0 + 12 } else if (hh > 11 && ampm === 'AM') { hh -= 12 } return new Date(year, month - 1, date, hh, mm, ss) } function getInt (str, i, minlength, maxlength) { for (var x = maxlength; x >= minlength; x--) { var token = str.substring(i, i + x) if (token.length < minlength) { return null } if (isInteger(token)) { return token } } return null } function isInteger (val) { return (new RegExp(/^\d+$/).test(val)) } function addZero (val) { return val > 9 ? val : '0' + val }