diff --git a/src/generate/dateFns.ts b/src/generate/dateFns.ts index 435e757cf..06ff8ce7d 100644 --- a/src/generate/dateFns.ts +++ b/src/generate/dateFns.ts @@ -19,6 +19,7 @@ import { isAfter, isValid, getWeek, + startOfWeek, format as formatDate, parse as parseDate, } from 'date-fns'; @@ -71,6 +72,9 @@ const generateConfig: GenerateConfig = { const clone = Locale[dealLocal(locale)]; return clone.options.weekStartsOn; }, + getWeekFirstDate: (locale, date) => { + return startOfWeek(date, { locale: Locale[dealLocal(locale)] }); + }, getWeek: (locale, date) => { return getWeek(date, { locale: Locale[dealLocal(locale)] }); }, diff --git a/src/generate/dayjs.ts b/src/generate/dayjs.ts index 3ca163534..b8560dd67 100644 --- a/src/generate/dayjs.ts +++ b/src/generate/dayjs.ts @@ -80,6 +80,7 @@ const generateConfig: GenerateConfig = { .locale(parseLocale(locale)) .localeData() .firstDayOfWeek(), + getWeekFirstDate: (locale, date) => date.locale(parseLocale(locale)).weekday(0), getWeek: (locale, date) => date.locale(parseLocale(locale)).week(), getShortWeekDays: locale => dayjs() diff --git a/src/generate/index.ts b/src/generate/index.ts index 1776732fd..7f7429594 100644 --- a/src/generate/index.ts +++ b/src/generate/index.ts @@ -28,6 +28,7 @@ export interface GenerateConfig { locale: { getWeekFirstDay: (locale: string) => number; + getWeekFirstDate: (locale: string, value: DateType) => DateType; getWeek: (locale: string, value: DateType) => number; format: (locale: string, date: DateType, format: string) => string; diff --git a/src/generate/moment.ts b/src/generate/moment.ts index e8bc3f3c0..4af057e16 100644 --- a/src/generate/moment.ts +++ b/src/generate/moment.ts @@ -68,6 +68,11 @@ const generateConfig: GenerateConfig = { const date = moment().locale(locale); return date.localeData().firstDayOfWeek(); }, + getWeekFirstDate: (locale, date) => { + const clone = date.clone(); + const result = clone.locale(locale); + return result.weekday(0); + }, getWeek: (locale, date) => { const clone = date.clone(); const result = clone.locale(locale); diff --git a/src/hooks/useRangeDisabled.ts b/src/hooks/useRangeDisabled.ts index c11ddb75d..1bbe585d6 100644 --- a/src/hooks/useRangeDisabled.ts +++ b/src/hooks/useRangeDisabled.ts @@ -26,10 +26,8 @@ export default function useRangeDisabled( const startDate = getValue(selectedValue, 0); const endDate = getValue(selectedValue, 1); - function weekNumber(date: DateType) { - const year = generateConfig.getYear(date); - const week = generateConfig.locale.getWeek(locale.locale, date); - return year * 100 + week; + function weekFirstDate(date: DateType) { + return generateConfig.locale.getWeekFirstDate(locale.locale, date); } function monthNumber(date: DateType) { @@ -63,7 +61,7 @@ export default function useRangeDisabled( case 'month': return monthNumber(date) > monthNumber(endDate); case 'week': - return weekNumber(date) > weekNumber(endDate); + return weekFirstDate(date) > weekFirstDate(endDate); default: return ( !isSameDate(generateConfig, date, endDate) && generateConfig.isAfter(date, endDate) @@ -97,7 +95,7 @@ export default function useRangeDisabled( case 'month': return monthNumber(date) < monthNumber(startDate); case 'week': - return weekNumber(date) < weekNumber(startDate); + return weekFirstDate(date) < weekFirstDate(startDate); default: return ( !isSameDate(generateConfig, date, startDate) && diff --git a/tests/generate.spec.tsx b/tests/generate.spec.tsx index 3281eed63..9a0606f99 100644 --- a/tests/generate.spec.tsx +++ b/tests/generate.spec.tsx @@ -132,6 +132,20 @@ describe('Picker.Generate', () => { }); }); + it('getWeekFirstDayValue', () => { + const formatStr = name === 'date-fns' ? 'yyyy-MM-dd' : 'YYYY-MM-DD'; + const usDate = generateConfig.locale.getWeekFirstDate( + 'en_US', + generateConfig.locale.parse('en_US', '2020-12-30', [formatStr]), + ); + const cnDate = generateConfig.locale.getWeekFirstDate( + 'zh_CN', + generateConfig.locale.parse('zh_CN', '2020-12-30', [formatStr]), + ); + expect(generateConfig.locale.format('en_US', usDate, formatStr)).toEqual('2020-12-27'); + expect(generateConfig.locale.format('zh_CN', cnDate, formatStr)).toEqual('2020-12-28'); + }); + it('Parse format Wo', () => { if (name !== 'date-fns') { expect(