123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328 |
- var getDayOfYear = require('../get_day_of_year/index.js')
- var getISOWeek = require('../get_iso_week/index.js')
- var getISOYear = require('../get_iso_year/index.js')
- var parse = require('../parse/index.js')
- var isValid = require('../is_valid/index.js')
- var enLocale = require('../locale/en/index.js')
- /**
- * @category Common Helpers
- * @summary Format the date.
- *
- * @description
- * Return the formatted date string in the given format.
- *
- * Accepted tokens:
- * | Unit | Token | Result examples |
- * |-------------------------|-------|----------------------------------|
- * | Month | M | 1, 2, ..., 12 |
- * | | Mo | 1st, 2nd, ..., 12th |
- * | | MM | 01, 02, ..., 12 |
- * | | MMM | Jan, Feb, ..., Dec |
- * | | MMMM | January, February, ..., December |
- * | Quarter | Q | 1, 2, 3, 4 |
- * | | Qo | 1st, 2nd, 3rd, 4th |
- * | Day of month | D | 1, 2, ..., 31 |
- * | | Do | 1st, 2nd, ..., 31st |
- * | | DD | 01, 02, ..., 31 |
- * | Day of year | DDD | 1, 2, ..., 366 |
- * | | DDDo | 1st, 2nd, ..., 366th |
- * | | DDDD | 001, 002, ..., 366 |
- * | Day of week | d | 0, 1, ..., 6 |
- * | | do | 0th, 1st, ..., 6th |
- * | | dd | Su, Mo, ..., Sa |
- * | | ddd | Sun, Mon, ..., Sat |
- * | | dddd | Sunday, Monday, ..., Saturday |
- * | Day of ISO week | E | 1, 2, ..., 7 |
- * | ISO week | W | 1, 2, ..., 53 |
- * | | Wo | 1st, 2nd, ..., 53rd |
- * | | WW | 01, 02, ..., 53 |
- * | Year | YY | 00, 01, ..., 99 |
- * | | YYYY | 1900, 1901, ..., 2099 |
- * | ISO week-numbering year | GG | 00, 01, ..., 99 |
- * | | GGGG | 1900, 1901, ..., 2099 |
- * | AM/PM | A | AM, PM |
- * | | a | am, pm |
- * | | aa | a.m., p.m. |
- * | Hour | H | 0, 1, ... 23 |
- * | | HH | 00, 01, ... 23 |
- * | | h | 1, 2, ..., 12 |
- * | | hh | 01, 02, ..., 12 |
- * | Minute | m | 0, 1, ..., 59 |
- * | | mm | 00, 01, ..., 59 |
- * | Second | s | 0, 1, ..., 59 |
- * | | ss | 00, 01, ..., 59 |
- * | 1/10 of second | S | 0, 1, ..., 9 |
- * | 1/100 of second | SS | 00, 01, ..., 99 |
- * | Millisecond | SSS | 000, 001, ..., 999 |
- * | Timezone | Z | -01:00, +00:00, ... +12:00 |
- * | | ZZ | -0100, +0000, ..., +1200 |
- * | Seconds timestamp | X | 512969520 |
- * | Milliseconds timestamp | x | 512969520900 |
- *
- * The characters wrapped in square brackets are escaped.
- *
- * The result may vary by locale.
- *
- * @param {Date|String|Number} date - the original date
- * @param {String} [format='YYYY-MM-DDTHH:mm:ss.SSSZ'] - the string of tokens
- * @param {Object} [options] - the object with options
- * @param {Object} [options.locale=enLocale] - the locale object
- * @returns {String} the formatted date string
- *
- * @example
- * // Represent 11 February 2014 in middle-endian format:
- * var result = format(
- * new Date(2014, 1, 11),
- * 'MM/DD/YYYY'
- * )
- * //=> '02/11/2014'
- *
- * @example
- * // Represent 2 July 2014 in Esperanto:
- * var eoLocale = require('date-fns/locale/eo')
- * var result = format(
- * new Date(2014, 6, 2),
- * 'Do [de] MMMM YYYY',
- * {locale: eoLocale}
- * )
- * //=> '2-a de julio 2014'
- */
- function format (dirtyDate, dirtyFormatStr, dirtyOptions) {
- var formatStr = dirtyFormatStr ? String(dirtyFormatStr) : 'YYYY-MM-DDTHH:mm:ss.SSSZ'
- var options = dirtyOptions || {}
- var locale = options.locale
- var localeFormatters = enLocale.format.formatters
- var formattingTokensRegExp = enLocale.format.formattingTokensRegExp
- if (locale && locale.format && locale.format.formatters) {
- localeFormatters = locale.format.formatters
- if (locale.format.formattingTokensRegExp) {
- formattingTokensRegExp = locale.format.formattingTokensRegExp
- }
- }
- var date = parse(dirtyDate)
- if (!isValid(date)) {
- return 'Invalid Date'
- }
- var formatFn = buildFormatFn(formatStr, localeFormatters, formattingTokensRegExp)
- return formatFn(date)
- }
- var formatters = {
- // Month: 1, 2, ..., 12
- 'M': function (date) {
- return date.getMonth() + 1
- },
- // Month: 01, 02, ..., 12
- 'MM': function (date) {
- return addLeadingZeros(date.getMonth() + 1, 2)
- },
- // Quarter: 1, 2, 3, 4
- 'Q': function (date) {
- return Math.ceil((date.getMonth() + 1) / 3)
- },
- // Day of month: 1, 2, ..., 31
- 'D': function (date) {
- return date.getDate()
- },
- // Day of month: 01, 02, ..., 31
- 'DD': function (date) {
- return addLeadingZeros(date.getDate(), 2)
- },
- // Day of year: 1, 2, ..., 366
- 'DDD': function (date) {
- return getDayOfYear(date)
- },
- // Day of year: 001, 002, ..., 366
- 'DDDD': function (date) {
- return addLeadingZeros(getDayOfYear(date), 3)
- },
- // Day of week: 0, 1, ..., 6
- 'd': function (date) {
- return date.getDay()
- },
- // Day of ISO week: 1, 2, ..., 7
- 'E': function (date) {
- return date.getDay() || 7
- },
- // ISO week: 1, 2, ..., 53
- 'W': function (date) {
- return getISOWeek(date)
- },
- // ISO week: 01, 02, ..., 53
- 'WW': function (date) {
- return addLeadingZeros(getISOWeek(date), 2)
- },
- // Year: 00, 01, ..., 99
- 'YY': function (date) {
- return addLeadingZeros(date.getFullYear(), 4).substr(2)
- },
- // Year: 1900, 1901, ..., 2099
- 'YYYY': function (date) {
- return addLeadingZeros(date.getFullYear(), 4)
- },
- // ISO week-numbering year: 00, 01, ..., 99
- 'GG': function (date) {
- return String(getISOYear(date)).substr(2)
- },
- // ISO week-numbering year: 1900, 1901, ..., 2099
- 'GGGG': function (date) {
- return getISOYear(date)
- },
- // Hour: 0, 1, ... 23
- 'H': function (date) {
- return date.getHours()
- },
- // Hour: 00, 01, ..., 23
- 'HH': function (date) {
- return addLeadingZeros(date.getHours(), 2)
- },
- // Hour: 1, 2, ..., 12
- 'h': function (date) {
- var hours = date.getHours()
- if (hours === 0) {
- return 12
- } else if (hours > 12) {
- return hours % 12
- } else {
- return hours
- }
- },
- // Hour: 01, 02, ..., 12
- 'hh': function (date) {
- return addLeadingZeros(formatters['h'](date), 2)
- },
- // Minute: 0, 1, ..., 59
- 'm': function (date) {
- return date.getMinutes()
- },
- // Minute: 00, 01, ..., 59
- 'mm': function (date) {
- return addLeadingZeros(date.getMinutes(), 2)
- },
- // Second: 0, 1, ..., 59
- 's': function (date) {
- return date.getSeconds()
- },
- // Second: 00, 01, ..., 59
- 'ss': function (date) {
- return addLeadingZeros(date.getSeconds(), 2)
- },
- // 1/10 of second: 0, 1, ..., 9
- 'S': function (date) {
- return Math.floor(date.getMilliseconds() / 100)
- },
- // 1/100 of second: 00, 01, ..., 99
- 'SS': function (date) {
- return addLeadingZeros(Math.floor(date.getMilliseconds() / 10), 2)
- },
- // Millisecond: 000, 001, ..., 999
- 'SSS': function (date) {
- return addLeadingZeros(date.getMilliseconds(), 3)
- },
- // Timezone: -01:00, +00:00, ... +12:00
- 'Z': function (date) {
- return formatTimezone(date.getTimezoneOffset(), ':')
- },
- // Timezone: -0100, +0000, ... +1200
- 'ZZ': function (date) {
- return formatTimezone(date.getTimezoneOffset())
- },
- // Seconds timestamp: 512969520
- 'X': function (date) {
- return Math.floor(date.getTime() / 1000)
- },
- // Milliseconds timestamp: 512969520900
- 'x': function (date) {
- return date.getTime()
- }
- }
- function buildFormatFn (formatStr, localeFormatters, formattingTokensRegExp) {
- var array = formatStr.match(formattingTokensRegExp)
- var length = array.length
- var i
- var formatter
- for (i = 0; i < length; i++) {
- formatter = localeFormatters[array[i]] || formatters[array[i]]
- if (formatter) {
- array[i] = formatter
- } else {
- array[i] = removeFormattingTokens(array[i])
- }
- }
- return function (date) {
- var output = ''
- for (var i = 0; i < length; i++) {
- if (array[i] instanceof Function) {
- output += array[i](date, formatters)
- } else {
- output += array[i]
- }
- }
- return output
- }
- }
- function removeFormattingTokens (input) {
- if (input.match(/\[[\s\S]/)) {
- return input.replace(/^\[|]$/g, '')
- }
- return input.replace(/\\/g, '')
- }
- function formatTimezone (offset, delimeter) {
- delimeter = delimeter || ''
- var sign = offset > 0 ? '-' : '+'
- var absOffset = Math.abs(offset)
- var hours = Math.floor(absOffset / 60)
- var minutes = absOffset % 60
- return sign + addLeadingZeros(hours, 2) + delimeter + addLeadingZeros(minutes, 2)
- }
- function addLeadingZeros (number, targetLength) {
- var output = Math.abs(number).toString()
- while (output.length < targetLength) {
- output = '0' + output
- }
- return output
- }
- module.exports = format
|