UNPKG

wux-weapp

Version:

一套组件化、可复用、易扩展的微信小程序 UI 组件库

225 lines (193 loc) 6.13 kB
import warning from '../helpers/libs/warning' export const DATETIME = 'datetime' export const DATE = 'date' export const TIME = 'time' export const MONTH = 'month' export const YEAR = 'year' export const ONE_DAY = 24 * 60 * 60 * 1000 export const TILL_NOW = 'TILL_NOW' export function fomartArray(min, max, step = 1) { let i = min let result = [] while (i <= max) { result.push(i) i+=step } return result } export function getDaysInMonth(date) { return new Date(date.getFullYear(), date.getMonth() + 1, 0).getDate() } export function pad(n) { return n < 10 ? `0${n}` : n + '' } export function cloneDate(date) { return new Date(+date) } export function setMonth(date, month) { date.setDate(Math.min(date.getDate(), getDaysInMonth(new Date(date.getFullYear(), month)))) date.setMonth(month) } export function isTillNow(value) { return value && (value.tillNow || value[0] === TILL_NOW) } export const modeRecord = { datetime: 'yyyy-MM-dd hh:mm', date: 'yyyy-MM-dd', year: 'yyyy', month: 'yyyy-MM', time: 'hh:mm', } export const makePattern = (str) => new RegExp(`^${str.replace(/[a-zA-Z]/g, '\\d')}$`) export const isDateString = (value) => Object.keys(modeRecord).some((key) => makePattern(modeRecord[key]).test(value)) export function isInvalidDate(date) { return isNaN(Date.parse(date)) && isNaN(new Date(date).getTime()) } export function convertStringArrayToDate(value, props = {}) { // Till Now if (isTillNow(value)) { return new Date() } // dateString or Unix 时间戳 if (!Array.isArray(value)) { const originalValue = value if (typeof value === 'string' && isDateString(value)) { const now = new Date() // fix yyyy to yyyy-MM-dd if (makePattern(modeRecord.year).test(value)) { value = `${value}-${now.getMonth()}-${now.getDate()}` } // fix yyyy-MM to yyyy-MM-dd if (makePattern(modeRecord.month).test(value)) { value = `${value}-${now.getDate()}` } // fix hh:mm to yyyy-MM-dd hh:mm if (makePattern(modeRecord.time).test(value)) { value = `${now.getFullYear()}-${now.getMonth()}-${now.getDate()} ${value}` } // fix ios value = value.replace(/\-/g, '/') } else if (!isNaN(parseInt(value))) { value = parseInt(value) } const newDate = new Date(value) if (isInvalidDate(newDate)) { warning(false, `${originalValue} not a date.`) return new Date() } return newDate } const { mode, use12Hours } = props // [year, monthIndex, date, hours, minutes, seconds] const fixValue = (v, m) => { const now = new Date() const year = now.getFullYear() const month = now.getMonth() const day = now.getDate() if (m === DATETIME) { return [ v[0] ? parseInt(v[0]) : year, v[1] ? parseInt(v[1]) : 0, v[2] ? parseInt(v[2]) : 1, v[3] ? parseInt(v[3]) : 0, v[4] ? parseInt(v[4]) : 0, 0, ] } else if (m === TIME) { return [ year, month, day, v[0] ? parseInt(v[0]) : 0, v[1] ? parseInt(v[1]) : 0, 0, ] } else if (m === DATE) { return [ v[0] ? parseInt(v[0]) : year, v[1] ? parseInt(v[1]) : 0, v[2] ? parseInt(v[2]) : 1, 0, 0, 0, ] } else if (m === MONTH) { return [ v[0] ? parseInt(v[0]) : year, v[1] ? parseInt(v[1]) : 0, 1, 0, 0, 0, ] } else if (m === YEAR) { return [ v[0] ? parseInt(v[0]) : year, 0, 1, 0, 0, 0, ] } } const getAmpm = (v, m) => { if (m === DATETIME) { return v[5] ? String(v[5]) : '0' } else if (m === TIME) { return v[2] ? String(v[2]) : '0' } } let newValue = fixValue(value, mode) // use12Hours ampm if (use12Hours) { if (mode === TIME || mode === DATETIME) { const ampm = getAmpm(value, mode) const hourIndex = 3 let nhour = parseInt(newValue[hourIndex]) if (ampm === '1') { if (nhour <= 12) { nhour += 12 } nhour = nhour >= 24 ? 0 : nhour } else { if (nhour === 0) { nhour = 12 } if (nhour > 12) { nhour -= 12 } nhour = nhour >= 12 ? 0 : nhour } newValue.splice(hourIndex, 1, nhour) } } return new Date(...newValue) } export function convertDateToStringArray(date, props = {}) { if (!date) { return [] } const { mode, use12Hours } = props let value = [] if (mode === YEAR) { value = [date.getFullYear() + ''] } if (mode === MONTH) { value = [date.getFullYear() + '', date.getMonth() + ''] } if (mode === DATETIME || mode === DATE) { value = [date.getFullYear() + '', date.getMonth() + '', date.getDate() + ''] } if (mode === DATETIME || mode === TIME) { const hour = date.getHours() const selMinute = date.getMinutes() let dtValue = [hour + '', selMinute + ''] let nhour = hour if (use12Hours) { nhour = hour === 0 ? 12 : (hour > 12 ? hour - 12 : hour) dtValue = [nhour + '', selMinute + '', (hour >= 12 ? 1 : 0) + ''] } value = value.concat(dtValue) } return value }