Skip to content

Commit 6b7c059

Browse files
authored
fix: date-fns format string compatible (#111)
* fix: date-fns format string compatible * feat: add test case
1 parent 40754cf commit 6b7c059

File tree

2 files changed

+24
-20
lines changed

2 files changed

+24
-20
lines changed

src/generate/dateFns.ts

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,15 @@ const dealLocal = (str: string) => {
2828
return str.replace(/_/g, '');
2929
};
3030

31+
const localeParse = (format: string) => {
32+
return format
33+
.replace(/Y/g, 'y')
34+
.replace(/D/g, 'd')
35+
.replace(/gggg/, 'yyyy')
36+
.replace(/g/g, 'G')
37+
.replace(/([Ww])o/g, 'wo');
38+
};
39+
3140
const generateConfig: GenerateConfig<Date> = {
3241
// get
3342
getNow: () => new Date(),
@@ -66,11 +75,13 @@ const generateConfig: GenerateConfig<Date> = {
6675
if (!isValid(date)) {
6776
return null;
6877
}
69-
return formatDate(date, format, { locale: Locale[dealLocal(locale)] });
78+
return formatDate(date, localeParse(format), {
79+
locale: Locale[dealLocal(locale)],
80+
});
7081
},
7182
parse: (locale, text, formats) => {
7283
for (let i = 0; i < formats.length; i += 1) {
73-
const format = formats[i];
84+
const format = localeParse(formats[i]);
7485
const formatText = text;
7586
const date = parseDate(formatText, format, new Date(), {
7687
locale: Locale[dealLocal(locale)],

tests/generate.spec.tsx

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -44,8 +44,7 @@ describe('Picker.Generate', () => {
4444
date = generateConfig.setMinute(date, 3);
4545
date = generateConfig.setSecond(date, 5);
4646

47-
const formatStr = name === 'date-fns' ? 'yyyy-MM-dd HH:mm:ss' : 'YYYY-MM-DD HH:mm:ss';
48-
expect(generateConfig.locale.format('en_US', date, formatStr)).toEqual(
47+
expect(generateConfig.locale.format('en_US', date, 'YYYY-MM-DD HH:mm:ss')).toEqual(
4948
'2020-10-23 02:03:05',
5049
);
5150
});
@@ -55,8 +54,7 @@ describe('Picker.Generate', () => {
5554
date = generateConfig.addYear(date, 2);
5655
date = generateConfig.addMonth(date, 2);
5756
date = generateConfig.addDate(date, 2);
58-
const formatStr = name === 'date-fns' ? 'yyyy-MM-dd' : 'YYYY-MM-DD';
59-
expect(generateConfig.locale.format('en_US', date, formatStr)).toEqual('1992-11-05');
57+
expect(generateConfig.locale.format('en_US', date, 'YYYY-MM-DD')).toEqual('1992-11-05');
6058
});
6159

6260
it('isAfter', () => {
@@ -74,41 +72,37 @@ describe('Picker.Generate', () => {
7472
describe('locale', () => {
7573
describe('parse', () => {
7674
it('basic', () => {
77-
const formatStr1 = name === 'date-fns' ? 'yyyy-MM-dd' : 'YYYY-MM-DD';
78-
const formatStr2 = name === 'date-fns' ? 'dd/mm/yyyy' : 'DD/MM/YYYY';
7975
['2000-01-02', '02/01/2000'].forEach(str => {
80-
const date = generateConfig.locale.parse('en_US', str, [formatStr1, formatStr2]);
76+
const date = generateConfig.locale.parse('en_US', str, ['YYYY-MM-DD', 'DD/MM/YYYY']);
8177

82-
expect(generateConfig.locale.format('en_US', date!, formatStr1)).toEqual(
78+
expect(generateConfig.locale.format('en_US', date!, 'YYYY-MM-DD')).toEqual(
8379
'2000-01-02',
8480
);
8581
});
8682
});
8783

8884
it('week', () => {
89-
const formatStr = name === 'date-fns' ? 'GGGG-wo' : 'gggg-wo';
9085
if (name !== 'date-fns') {
9186
expect(
9287
generateConfig.locale.format(
9388
'en_US',
94-
generateConfig.locale.parse('en_US', '2019-1st', [formatStr])!,
95-
formatStr,
89+
generateConfig.locale.parse('en_US', '2019-1st', ['gggg-wo'])!,
90+
'gggg-wo',
9691
),
9792
).toEqual('2019-1st');
98-
9993
expect(
10094
generateConfig.locale.format(
10195
'zh_CN',
102-
generateConfig.locale.parse('zh_CN', '2019-45周', [formatStr])!,
103-
formatStr,
96+
generateConfig.locale.parse('zh_CN', '2019-45周', ['gggg-wo'])!,
97+
'gggg-wo',
10498
),
10599
).toEqual('2019-45周');
106100
} else {
107101
expect(
108102
generateConfig.locale.format(
109103
'en_US',
110-
generateConfig.locale.parse('en_US', '2019-1st', [formatStr])!,
111-
formatStr,
104+
generateConfig.locale.parse('en_US', '2019-1st', ['GGGG-wo'])!,
105+
'GGGG-wo',
112106
),
113107
).toEqual(null);
114108
}
@@ -120,12 +114,11 @@ describe('Picker.Generate', () => {
120114
expect(generateConfig.locale.getWeekFirstDay('en_US')).toEqual(0);
121115
expect(generateConfig.locale.getWeekFirstDay('zh_CN')).toEqual(1);
122116

123-
const formatStr = name === 'date-fns' ? 'yyyy-MM-dd' : 'YYYY-MM-DD';
124117
// Should keep same weekday
125118
['en_US', 'zh_CN'].forEach(() => {
126119
expect(
127120
generateConfig.getWeekDay(
128-
generateConfig.locale.parse('en_US', '2000-01-01', [formatStr])!,
121+
generateConfig.locale.parse('en_US', '2000-01-01', ['YYYY-MM-DD'])!,
129122
),
130123
).toEqual(6);
131124
});

0 commit comments

Comments
 (0)