date.js

/** @module Date */

/**
 * 格式化日期。如果value无法被new Date()转换为日期对象,返回空字符串。
 * @function dateFormat
 * @param {date} [date=new Date()] - 可选,需要格式化的日期,默认是当前时间。
 * @param {string} [format='YYYY-MM-DD']- 可选,格式化的格式,默认是`YYYY-MM-DD`格式。
 * @return {string}
 * @example
 * U.dateFormat(new Date(2018, 11, 10))
 * // => '2018-12-10'
 *
 * U.dateFormat(new Date(2018, 11, 10, 10, 29, 36), 'YYYY-MM-DD hh:mm:ss')
 * // => '2018-12-10 10:29:36'
 *
 * U.dateFormat(1545484848484, 'YYYY-MM-DD hh:mm:ss')
 * // => '2018-12-22 21:20:48'
 */
export const dateFormat = (date = new Date(), format = 'YYYY-MM-DD') => {
  const d = new Date(date)
  const zeroize = val => val < 10 ? `0${val}` : `${val}`
  return format.replace(
    /YYYY|MM|DD|hh|mm|ss/g,
    word => ({
      'YYYY': d.getFullYear(),
      'MM': zeroize(d.getMonth() + 1),
      'DD': zeroize(d.getDate()),
      'hh': zeroize(d.getHours()),
      'mm': zeroize(d.getMinutes()),
      'ss': zeroize(d.getSeconds())
    }[word] || word)
  )
}

/**
 * 获取某月的总天数,date可以是任意能被new Date()格式化为日期对象的值。
 * @function getMonthDays
 * @param {date} [date=new Date()] - 可选,日期,默认是当前时间。
 * @return {number}
 * @example
 * U.getMonthDays(new Date(2018, 1))
 * // => 28
 *
 * U.getMonthDays(153454878787)
 * // => 30
 */
export const getMonthDays = (date = new Date()) => {
  const d = new Date(date)
  d.setMonth(d.getMonth() + 1)
  d.setDate(0)
  return d.getDate()
}

/**
 * 获取星期名称,lang代表输出语言。date为日期,可以是任意能被new Date()格式化为日期对象的值。
 * @function getWeekday
 * @param {string} [lang='zh'] - 可选,输出语言,默认为'zh',当该值为undefined时取'zh'——表示中文,'en'——表示英文。
 * @param {data} [date=new Date()] - 可选,日期,默认为当前日期。
 * @return {string}
 * @example
 * U.getWeekday('zh', new Date(2018, 1, 1))
 * // => '星期四'
 *
 * * U.getWeekday('zh', '2018/2/1')
 * // => '星期四'
 * 
 * U.getWeekday('en', 153454878787)
 * // => 'Tuesday'
 */
export const getWeekday = (lang = 'zh', date = new Date()) => {
  const day = new Date(date).getDay()
  return lang === 'en'
    ? ['Sunday', 'Monday', 'Tuesday', 'Wednesday', 'Thursday', 'Friday', 'Saturday'][day]
    : '星期' + '日一二三四五六'.charAt(day)
}

/**
 * 获取上一个月份
 * @function prevMonth
 * @param {*} [date=new Date()]- 可选,日期,默认是当前时间。
 * @return {date}
 * @example
 * U.prevMonth()
 * // => 2018-11-20T17:07:37.937Z (当前时间为2018-12)
 *
 * U.prevMonth(new Date(2018, 10, 9))
 * // => 2018-10-08T16:00:00.000Z
 * 
 * U.prevMonth(153454878787)
 * // => 1974-10-12T02:21:18.787Z
 * 
 * U.prevMonth('2018/12/3')
 * // => 2018-11-02T16:00:00.000Z
 */
export const prevMonth = (date = new Date()) => {
  let d = new Date(date)
  d.setMonth(d.getMonth() - 1)
  return d
}

/**
 * 获取下一个月份
 * @function nextMonth
 * @param {date} [date=new Date()] - 可选,日期,默认是当前时间。
 * @return {date}
 * @example
 * U.nextMonth()
 * // => 2019-01-20T17:13:15.179Z (当前时间为2018-12)
 *
 * U.nextMonth(new Date(2018, 10, 9))
 * // => 2018-10-08T16:00:00.000Z
 * 
 * U.nextMonth(153454878787)
 * // => 1974-12-12T02:21:18.787Z
 * 
 * U.nextMonth('2018/12/3')
 * // => 2018-11-02T16:00:00.000Z
 */
export const nextMonth = (date = new Date()) => {
  let d = new Date(date)
  d.setMonth(d.getMonth() + 1)
  return d
}

/**
 * 比较日期dateA是否是dateB之后的日期,返回布尔值
 * @function isAfterDate
 * @param {date} dateA - 较后的日期。
 * @param {date} dateB - 较前的日期。
 * @return {boolean}
 * @example
 * U.isAfterDate('2018/11/1', '2018/11/30')
 * // => false
 *
 * U.isAfterDate(new Date(2018, 12, 11), new Date(2018, 12, 10))
 * // => true
 */
export const isAfterDate = (dateA, dateB) => new Date(dateA) > new Date(dateB)

/**
 * 返回距离date为n天的日期
 * @function spreadDate
 * @param {number} n - 天数。当n为负数,返回过去的日期;当n为正数,返回未来的日期。
 * @param {date} [date=new Date()] - 可选,日期,默认为当前日期。
 * @return {date}
 * @example
 * U.spreadDate(1)
 * // => Thu Feb 21 2019 21:01:53 GMT+0800 (当前时间:Wed Feb 20 2019 21:01:53 GMT+0800 )
 *
 * U.spreadDate(1)
 * // => Thu Feb 19 2019 21:01:53 GMT+0800 (当前时间:Wed Feb 20 2019 21:01:53 GMT+0800 )
 * 
 * U.spreadDate(7, new Date(2018, 9, 10))
 * // => Wed Oct 17 2018 00:00:00 GMT+0800 (中国标准时间)
 */
export const spreadDate = (n, date = new Date()) => new Date(+date + n * 24 * 60 * 60 * 1000)