diff --git a/src/generate/moment.ts b/src/generate/moment.ts index 08c1e8d69..b09fbf526 100644 --- a/src/generate/moment.ts +++ b/src/generate/moment.ts @@ -5,7 +5,7 @@ import { GenerateConfig } from '.'; const generateConfig: GenerateConfig = { // get getNow: () => moment(), - getWeekDay: date => date.clone().locale('en_US').weekday(), + getWeekDay: date => date.weekday(), getYear: date => date.year(), getMonth: date => date.month(), getDate: date => date.date(), diff --git a/src/utils/dateUtil.ts b/src/utils/dateUtil.ts index 56c428269..3f5498742 100644 --- a/src/utils/dateUtil.ts +++ b/src/utils/dateUtil.ts @@ -1,4 +1,3 @@ -import { noteOnce } from 'rc-util/lib/warning'; import { GenerateConfig } from '../generate'; import { NullableDateType, PickerMode } from '../interface'; @@ -104,8 +103,7 @@ export function isSameWeek( } return ( - generateConfig.locale.getWeek(locale, date1!) === - generateConfig.locale.getWeek(locale, date2!) + generateConfig.locale.getWeek(locale, date1!) === generateConfig.locale.getWeek(locale, date2!) ); } @@ -114,10 +112,7 @@ export function isEqual( value1: NullableDateType, value2: NullableDateType, ) { - return ( - isSameDate(generateConfig, value1, value2) && - isSameTime(generateConfig, value1, value2) - ); + return isSameDate(generateConfig, value1, value2) && isSameTime(generateConfig, value1, value2); } /** Between in date but not equal of date */ @@ -144,25 +139,10 @@ export function getWeekStartDate( generateConfig: GenerateConfig, value: DateType, ) { - const weekFirstDay = generateConfig.locale.getWeekFirstDay(locale); const monthStartDate = generateConfig.setDate(value, 1); + const wd = generateConfig.getWeekDay(monthStartDate); - for (let i = 0; i < 7; i += 1) { - const current = generateConfig.addDate(monthStartDate, -i); - if (generateConfig.getWeekDay(current) === weekFirstDay) { - return current; - } - } - - /* istanbul ignore next */ - /* eslint-disable no-lone-blocks */ - { - noteOnce( - false, - 'Not find week start date. Please check your `generateConfig`. If using default `generateConfig`, please help to fire a issue.', - ); - return value; - } + return generateConfig.addDate(monthStartDate, -wd); } export function getClosingViewDate( diff --git a/tests/util.spec.tsx b/tests/util.spec.tsx index 5d89885aa..dc038f5e2 100644 --- a/tests/util.spec.tsx +++ b/tests/util.spec.tsx @@ -1,6 +1,7 @@ +import moment from 'moment'; import momentGenerateConfig from '../src/generate/moment'; import { toArray } from '../src/utils/miscUtil'; -import { isSameTime, isSameDecade } from '../src/utils/dateUtil'; +import { isSameTime, isSameDecade, getWeekStartDate } from '../src/utils/dateUtil'; import { getMoment } from './util/commonUtil'; describe('Picker.Util', () => { @@ -14,31 +15,57 @@ describe('Picker.Util', () => { // Time is only for time it('isSameTime', () => { expect( - isSameTime( - momentGenerateConfig, - getMoment('2000-01-01'), - getMoment('1989-11-28'), - ), + isSameTime(momentGenerateConfig, getMoment('2000-01-01'), getMoment('1989-11-28')), ).toBeTruthy(); - expect( - isSameTime(momentGenerateConfig, null, getMoment('1989-11-28')), - ).toBeFalsy(); + expect(isSameTime(momentGenerateConfig, null, getMoment('1989-11-28'))).toBeFalsy(); expect(isSameTime(momentGenerateConfig, null, null)).toBeTruthy(); }); it('isSameDecade', () => { expect(isSameDecade(momentGenerateConfig, null, null)).toBeTruthy(); + expect(isSameDecade(momentGenerateConfig, getMoment('2000-01-02'), null)).toBeFalsy(); expect( - isSameDecade(momentGenerateConfig, getMoment('2000-01-02'), null), - ).toBeFalsy(); + isSameDecade(momentGenerateConfig, getMoment('1995-01-01'), getMoment('1999-01-01')), + ).toBeTruthy(); + }); + + it('getWeekStartDate: en', () => { expect( - isSameDecade( - momentGenerateConfig, - getMoment('1995-01-01'), - getMoment('1999-01-01'), + getWeekStartDate('en', momentGenerateConfig, getMoment('2020-03-17').locale('en')).format( + 'YYYY-MM-DD', ), - ).toBeTruthy(); + ).toBe('2020-03-01'); + }); + + it('getWeekStartDate: zh-cn', () => { + expect( + getWeekStartDate( + 'zh-cn', + momentGenerateConfig, + getMoment('2020-03-17').locale('zh-cn'), + ).format('YYYY-MM-DD'), + ).toBe('2020-02-24'); + }); + + describe('week starts from monday', () => { + const defaultWeekStartDate = moment.localeData().firstDayOfWeek(); + const locale = moment.locale(); + + beforeAll(() => { + moment.updateLocale(locale, { week: { dow: 1 } }); + }); + afterAll(() => { + moment.updateLocale(locale, { week: { dow: defaultWeekStartDate } }); + }); + + it('getWeekStartDate', () => { + expect( + getWeekStartDate(locale, momentGenerateConfig, getMoment('2020-03-17')).format( + 'YYYY-MM-DD', + ), + ).toBe('2020-02-24'); + }); }); });