mora-scripts
Version:
Some collection scripts by myself
135 lines (123 loc) • 3.4 kB
JavaScript
/**
* @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
}