From a99036294dea1e9e832f794fc6e573507878d5eb Mon Sep 17 00:00:00 2001 From: zoomdong <1344492820@qq.com> Date: Thu, 30 Jul 2020 23:37:10 +0800 Subject: [PATCH 1/2] fix: date-fns format string compatible --- src/generate/dateFns.ts | 15 +++++++++++++-- tests/generate.spec.tsx | 32 +++++++++----------------------- 2 files changed, 22 insertions(+), 25 deletions(-) diff --git a/src/generate/dateFns.ts b/src/generate/dateFns.ts index e201e2379..c88a40a9e 100644 --- a/src/generate/dateFns.ts +++ b/src/generate/dateFns.ts @@ -28,6 +28,15 @@ const dealLocal = (str: string) => { return str.replace(/_/g, ''); }; +const localeParse = (format: string) => { + return format + .replace(/Y/g, 'y') + .replace(/D/g, 'd') + .replace(/gggg/, 'yyyy') + .replace(/g/g, 'G') + .replace(/([Ww])o/g, 'wo'); +}; + const generateConfig: GenerateConfig = { // get getNow: () => new Date(), @@ -66,11 +75,13 @@ const generateConfig: GenerateConfig = { if (!isValid(date)) { return null; } - return formatDate(date, format, { locale: Locale[dealLocal(locale)] }); + return formatDate(date, localeParse(format), { + locale: Locale[dealLocal(locale)], + }); }, parse: (locale, text, formats) => { for (let i = 0; i < formats.length; i += 1) { - const format = formats[i]; + const format = localeParse(formats[i]); const formatText = text; const date = parseDate(formatText, format, new Date(), { locale: Locale[dealLocal(locale)], diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index cf55e27af..cd62b463a 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -44,8 +44,7 @@ describe('Picker.Generate', () => { date = generateConfig.setMinute(date, 3); date = generateConfig.setSecond(date, 5); - const formatStr = name === 'date-fns' ? 'yyyy-MM-dd HH:mm:ss' : 'YYYY-MM-DD HH:mm:ss'; - expect(generateConfig.locale.format('en_US', date, formatStr)).toEqual( + expect(generateConfig.locale.format('en_US', date, 'YYYY-MM-DD HH:mm:ss')).toEqual( '2020-10-23 02:03:05', ); }); @@ -55,8 +54,7 @@ describe('Picker.Generate', () => { date = generateConfig.addYear(date, 2); date = generateConfig.addMonth(date, 2); date = generateConfig.addDate(date, 2); - const formatStr = name === 'date-fns' ? 'yyyy-MM-dd' : 'YYYY-MM-DD'; - expect(generateConfig.locale.format('en_US', date, formatStr)).toEqual('1992-11-05'); + expect(generateConfig.locale.format('en_US', date, 'YYYY-MM-DD')).toEqual('1992-11-05'); }); it('isAfter', () => { @@ -74,43 +72,32 @@ describe('Picker.Generate', () => { describe('locale', () => { describe('parse', () => { it('basic', () => { - const formatStr1 = name === 'date-fns' ? 'yyyy-MM-dd' : 'YYYY-MM-DD'; - const formatStr2 = name === 'date-fns' ? 'dd/mm/yyyy' : 'DD/MM/YYYY'; ['2000-01-02', '02/01/2000'].forEach(str => { - const date = generateConfig.locale.parse('en_US', str, [formatStr1, formatStr2]); + const date = generateConfig.locale.parse('en_US', str, ['YYYY-MM-DD', 'DD/MM/YYYY']); - expect(generateConfig.locale.format('en_US', date!, formatStr1)).toEqual( + expect(generateConfig.locale.format('en_US', date!, 'YYYY-MM-DD')).toEqual( '2000-01-02', ); }); }); it('week', () => { - const formatStr = name === 'date-fns' ? 'GGGG-wo' : 'gggg-wo'; if (name !== 'date-fns') { expect( generateConfig.locale.format( 'en_US', - generateConfig.locale.parse('en_US', '2019-1st', [formatStr])!, - formatStr, + generateConfig.locale.parse('en_US', '2019-1st', ['gggg-wo'])!, + 'gggg-wo', ), ).toEqual('2019-1st'); expect( generateConfig.locale.format( 'zh_CN', - generateConfig.locale.parse('zh_CN', '2019-45周', [formatStr])!, - formatStr, + generateConfig.locale.parse('zh_CN', '2019-45周', ['gggg-wo'])!, + 'gggg-wo', ), ).toEqual('2019-45周'); - } else { - expect( - generateConfig.locale.format( - 'en_US', - generateConfig.locale.parse('en_US', '2019-1st', [formatStr])!, - formatStr, - ), - ).toEqual(null); } }); }); @@ -120,12 +107,11 @@ describe('Picker.Generate', () => { expect(generateConfig.locale.getWeekFirstDay('en_US')).toEqual(0); expect(generateConfig.locale.getWeekFirstDay('zh_CN')).toEqual(1); - const formatStr = name === 'date-fns' ? 'yyyy-MM-dd' : 'YYYY-MM-DD'; // Should keep same weekday ['en_US', 'zh_CN'].forEach(() => { expect( generateConfig.getWeekDay( - generateConfig.locale.parse('en_US', '2000-01-01', [formatStr])!, + generateConfig.locale.parse('en_US', '2000-01-01', ['YYYY-MM-DD'])!, ), ).toEqual(6); }); From 5dfb4450010a61d54edbfc5926601eec720f1db1 Mon Sep 17 00:00:00 2001 From: zoomdong <1344492820@qq.com> Date: Thu, 30 Jul 2020 23:58:14 +0800 Subject: [PATCH 2/2] feat: add test case --- tests/generate.spec.tsx | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index cd62b463a..3c44ad67c 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -90,7 +90,6 @@ describe('Picker.Generate', () => { 'gggg-wo', ), ).toEqual('2019-1st'); - expect( generateConfig.locale.format( 'zh_CN', @@ -98,6 +97,14 @@ describe('Picker.Generate', () => { 'gggg-wo', ), ).toEqual('2019-45周'); + } else { + expect( + generateConfig.locale.format( + 'en_US', + generateConfig.locale.parse('en_US', '2019-1st', ['GGGG-wo'])!, + 'GGGG-wo', + ), + ).toEqual(null); } }); });