From bf27fda1e3292973eb54fe9699f2637b44efaefe Mon Sep 17 00:00:00 2001 From: iamkun Date: Sun, 10 Mar 2019 16:59:36 +0800 Subject: [PATCH] fix: CustomParseFormat plugin parse Do format string fix #522 --- src/plugin/customParseFormat/index.js | 12 +++++++++++- test/plugin/customParseFormat.test.js | 17 +++++++++++++++++ 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/plugin/customParseFormat/index.js b/src/plugin/customParseFormat/index.js index cffbffbbb..0851d4edd 100644 --- a/src/plugin/customParseFormat/index.js +++ b/src/plugin/customParseFormat/index.js @@ -1,4 +1,4 @@ -const formattingTokens = /(\[[^[]*\])|([-:/.()\s]+)|(A|a|YYYY|YY?|MM?M?M?|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g +const formattingTokens = /(\[[^[]*\])|([-:/.()\s]+)|(A|a|YYYY|YY?|MM?M?M?|Do|DD?|hh?|HH?|mm?|ss?|S{1,3}|z|ZZ?)/g const match1 = /\d/ // 0 - 9 const match2 = /\d\d/ // 00 - 99 @@ -56,6 +56,16 @@ const expressions = { hh: [match1to2, addInput('hours')], D: [match1to2, addInput('day')], DD: [match2, addInput('day')], + Do: [matchWord, function (input) { + const { ordinal } = locale; + [this.day] = input.match(/\d+/) + if (!ordinal) return + for (let i = 1; i <= 31; i += 1) { + if (ordinal(i).replace(/\[|\]/g, '') === input) { + this.day = i + } + } + }], M: [match1to2, addInput('month')], MM: [match2, addInput('month')], MMM: [matchWord, function (input) { diff --git a/test/plugin/customParseFormat.test.js b/test/plugin/customParseFormat.test.js index eb2f2204b..46286bc66 100644 --- a/test/plugin/customParseFormat.test.js +++ b/test/plugin/customParseFormat.test.js @@ -3,6 +3,7 @@ import moment from 'moment' import dayjs from '../../src' import customParseFormat from '../../src/plugin/customParseFormat' import uk from '../../src/locale/uk' +import '../../src/locale/zh-cn' dayjs.extend(customParseFormat) @@ -169,3 +170,19 @@ it('correctly parse month from string after changing locale globally', () => { moment.locale(momentLocale) } }) + +it('correctly parse ordinal', () => { + const input = '7th March 2019' + const input2 = '17th March 2019' + const inputFalse = '7st March 2019' + const inputZHCN = '7日 三月 2019' + const format = 'Do MMMM YYYY' + expect(dayjs(input, format).valueOf()) + .toBe(moment(input, format).valueOf()) + expect(dayjs(input2, format).valueOf()) + .toBe(moment(input2, format).valueOf()) + expect(dayjs(inputFalse, format).valueOf()) + .toBe(moment(inputFalse, format).valueOf()) + expect(dayjs(inputZHCN, format, 'zh-cn').valueOf()) + .toBe(moment(inputZHCN, format, 'zh-cn').valueOf()) +})