diff --git a/src/RangePicker.tsx b/src/RangePicker.tsx index 4202b786f..4b289feeb 100644 --- a/src/RangePicker.tsx +++ b/src/RangePicker.tsx @@ -382,25 +382,31 @@ function InnerRangePicker(props: RangePickerProps) { const startValue = getValue(values, 0); let endValue = getValue(values, 1); - // Clean up end date when start date is after end date if ( startValue && endValue && - !isSameDate(generateConfig, startValue, endValue) && generateConfig.isAfter(startValue, endValue) ) { - values = [startValue, null]; - endValue = null; + if (!isSameDate(generateConfig, startValue, endValue)) { + // Clean up end date when start date is after end date + values = [startValue, null]; + endValue = null; + } else { + // Reorder when in same date + values = [endValue, startValue]; + } } setSelectedValue(values); - const startStr = startValue - ? generateConfig.locale.format(locale.locale, startValue, formatList[0]) - : ''; - const endStr = endValue - ? generateConfig.locale.format(locale.locale, endValue, formatList[0]) - : ''; + const startStr = + values && values[0] + ? generateConfig.locale.format(locale.locale, values[0], formatList[0]) + : ''; + const endStr = + values && values[1] + ? generateConfig.locale.format(locale.locale, values[1], formatList[0]) + : ''; if (onCalendarChange) { onCalendarChange(values, [startStr, endStr]); diff --git a/tests/range.spec.tsx b/tests/range.spec.tsx index faf1a1713..b4c16f565 100644 --- a/tests/range.spec.tsx +++ b/tests/range.spec.tsx @@ -1045,4 +1045,40 @@ describe('Picker.Range', () => { expect(wrapper.find('DatePanel').length).toBeFalsy(); expect(wrapper.find('MonthPanel').length).toBeTruthy(); }); + + it('datetime should reorder in onChange if start is after end in same date', () => { + const onChange = jest.fn(); + + const wrapper = mount(); + wrapper.openPicker(); + wrapper.selectCell(15); + wrapper + .find('ul') + .first() + .find('li') + .last() + .simulate('click'); + wrapper.find('.rc-picker-ok button').simulate('click'); + + wrapper.selectCell(15); + wrapper + .find('ul') + .first() + .find('li') + .first() + .simulate('click'); + wrapper.find('.rc-picker-ok button').simulate('click'); + + expect(onChange).toHaveBeenCalledWith(expect.anything(), [ + '1990-09-15 00:00:00', + '1990-09-15 23:00:00', + ]); + + expect( + isSame(onChange.mock.calls[0][0][0], '1990-09-15 00:00:00'), + ).toBeTruthy(); + expect( + isSame(onChange.mock.calls[0][0][1], '1990-09-15 23:00:00'), + ).toBeTruthy(); + }); });