All files / libs/lang formatDate.js

100% Statements 48/48
100% Branches 35/35
100% Functions 4/4
100% Lines 48/48
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135                1x                           1x                     1x                                                                         1x 12x 1x 1x     12x 12x 12x 12x   12x 12x 12x   12x 12x   12x 34x 2x 1x 1x 1x 1x 1x 1x 1x 1x 1x 11x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x 1x               6x       11x 11x 11x   11x 7x     11x    
/**
 * @module      libs/lang/formatDate
 * @createdAt   2016-07-14
 *
 * @copyright   Copyright (c) 2016 Zhonglei Qiu
 * @license     Licensed under the MIT license.
 */
 
var MONTHS = [
  ['Jan', 'January'],
  ['Feb', 'February'],
  ['Mar', 'March'],
  ['Apr', 'April'],
  ['May', 'May'],
  ['Jun', 'June'],
  ['Jul', 'July'],
  ['Aug', 'August'],
  ['Sep', 'September'],
  ['Oct', 'October'],
  ['Nov', 'November'],
  ['Dec', 'December']
]
var WEEKS = [
  ['Sun', 'Sunday'],
  ['Mon', 'Monday'],
  ['Tue', 'Tuesday'],
  ['Wed', 'Wednesday'],
  ['Thu', 'Thursday'],
  ['Fri', 'Friday'],
  ['Sat', 'Saturday']
]
 
// 注意,要把长的放前面,表示优先匹配
var gre = /(?:yyyy|yy|mm|m|MM|M|dd|d|DD|Do|D|HH|H|hh|h|A|a|ii|i|ss|s|X|x)/g
 
/**
 * 格式化日期
 *
 * @param  {Date}   [date]  要格式化的日期,如果不传则使用当前日期
 * @param  {String} format  格式字符串,支持如下格式(以 2014-01-02 04:05:06 为例):
 *
 *  FORMAT  |       EXAMPLE
 *  --------|----------------
 *  yyyy    |       2014
 *  yy      |       14
 *  m, mm   |       1, 01
 *  M, MM   |       Jan, January
 *  d, dd   |       2, 02
 *  D, DD   |       Thur, Thursday
 *  Do      |       2nd(Day of month with ordinal: 1st..31st)
 *  H, HH   |       4, 04(24 hour time)
 *  h, hh   |       4, 04 (12 hour time used with `a A`)
 *  a, A    |       am, AM
 *  i, ii   |       5, 05
 *  s, ss   |       6, 06
 *  x       |       1388646306
 *  X       |       1388646306346
 *
 * @return {String}         格式化后的日期
 *
 * @example
 *
 * formatDate('yyyy-mm-dd HH:ii:ss')
 * // 2016-07-08 15:03:02
 * formatDate(new Date(), 'h:ii A')
 * // 8:30 AM
 *
 * @author Zhonglei Qiu
 * @since 2.0.0
 */
module.exports = function(date, format) {
  if (!format) {
    format = date
    date = new Date()
  }
 
  var year = date.getFullYear()
  var month = date.getMonth()
  var day = date.getDate()
  var week = date.getDay()
 
  var hour = date.getHours()
  var minute = date.getMinutes()
  var second = date.getSeconds()
 
  var h = hour % 12
  var a = hour > 11 ? 'pm' : 'am'
 
  return format.replace(gre, function(key) {
    switch (key) {
      case 'yyyy': return year
      case 'yy': return year.toString().substr(2)
      case 'mm': return pad(month + 1)
      case 'm': return month + 1
      case 'MM': return MONTHS[month][1]
      case 'M': return MONTHS[month][0]
      case 'dd': return pad(day)
      case 'd': return day
      case 'DD': return WEEKS[week][1]
      case 'D': return WEEKS[week][0]
      case 'Do': return order(day)
      case 'HH': return pad(hour)
      case 'H': return hour
      case 'hh': return pad(h)
      case 'h': return h
      case 'a': return a
      case 'A': return a.toUpperCase()
      case 'ii': return pad(minute)
      case 'i': return minute
      case 'ss': return pad(second)
      case 's': return second
      case 'x': return Math.round(date.getTime() / 1000)
      case 'X': return date.getTime()
      /* istanbul ignore next 正则是精确匹配,不可能出现下面情况 */
      default: return key
    }
  })
}
 
function pad(num) {
  return num < 10 ? '0' + num : num
}
 
function order(day) {
  var prefix = day.toString()
  var suffix = 'th'
  var map = {'1': 'st', '2': 'nd', '3': 'rd'}
 
  if (day < 4 || day > 20) {
    suffix = map[prefix.toString().slice(-1)] || 'th'
  }
 
  return prefix + suffix
}