Skip to content

Commit 51bb0ec

Browse files
authored
fix: moment set firstDayOfWeek issue (#45)
* adjust weekday logic * add test case * fix test * update start date logic * un-comment
1 parent 79ebbb8 commit 51bb0ec

File tree

4 files changed

+36
-18
lines changed

4 files changed

+36
-18
lines changed

examples/basic.tsx

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ export default () => {
3737
<div style={{ margin: '0 8px' }}>
3838
<h3>Basic</h3>
3939
<Picker<Moment> {...sharedProps} locale={zhCN} />
40+
<Picker<Moment> {...sharedProps} locale={enUS} />
4041
</div>
4142
<div style={{ margin: '0 8px' }}>
4243
<h3>Uncontrolled</h3>

src/generate/moment.ts

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,10 @@ import { GenerateConfig } from '.';
55
const generateConfig: GenerateConfig<Moment> = {
66
// get
77
getNow: () => moment(),
8-
getWeekDay: date => date.clone().locale('en_US').weekday(),
8+
getWeekDay: date => {
9+
const clone = date.clone().locale('en_US');
10+
return clone.weekday() + clone.localeData().firstDayOfWeek();
11+
},
912
getYear: date => date.year(),
1013
getMonth: date => date.month(),
1114
getDate: date => date.date(),

src/utils/dateUtil.ts

Lines changed: 2 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import { noteOnce } from 'rc-util/lib/warning';
21
import { GenerateConfig } from '../generate';
32
import { NullableDateType, PickerMode } from '../interface';
43

@@ -163,23 +162,9 @@ export function getWeekStartDate<DateType>(
163162
) {
164163
const weekFirstDay = generateConfig.locale.getWeekFirstDay(locale);
165164
const monthStartDate = generateConfig.setDate(value, 1);
165+
const startDateWeekDay = generateConfig.getWeekDay(monthStartDate);
166166

167-
for (let i = 0; i < 7; i += 1) {
168-
const current = generateConfig.addDate(monthStartDate, -i);
169-
if (generateConfig.getWeekDay(current) === weekFirstDay) {
170-
return current;
171-
}
172-
}
173-
174-
/* istanbul ignore next */
175-
/* eslint-disable no-lone-blocks */
176-
{
177-
noteOnce(
178-
false,
179-
'Not find week start date. Please check your `generateConfig`. If using default `generateConfig`, please help to fire a issue.',
180-
);
181-
return value;
182-
}
167+
return generateConfig.addDate(monthStartDate, weekFirstDay - startDateWeekDay);
183168
}
184169

185170
export function getClosingViewDate<DateType>(

tests/panel.spec.tsx

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -437,5 +437,34 @@ describe('Picker.Panel', () => {
437437
});
438438
},
439439
);
440+
441+
it('update firstDayOfWeek', () => {
442+
const defaultFirstDay = moment(enUS.locale)
443+
.localeData()
444+
.firstDayOfWeek();
445+
moment.updateLocale(enUS.locale, {
446+
week: {
447+
dow: 5,
448+
} as any,
449+
});
450+
expect(defaultFirstDay).toEqual(0);
451+
452+
const wrapper = mount(
453+
<MomentPickerPanel defaultValue={getMoment('2020-04-02')} locale={enUS} />,
454+
);
455+
456+
expect(
457+
wrapper
458+
.find('td')
459+
.first()
460+
.text(),
461+
).toEqual('27');
462+
463+
moment.updateLocale(enUS.locale, {
464+
week: {
465+
dow: defaultFirstDay,
466+
} as any,
467+
});
468+
});
440469
});
441470
});

0 commit comments

Comments
 (0)