Handle ambiguous dates (with no offset) in DateTimePickerControl (#35077)
* Add tests for ambiguous and unambiguous UTC dates * Assume UTC for ambiguous dates * Changelog * Remove console statements
This commit is contained in:
parent
1eecefb715
commit
0cbc45ba85
|
@ -0,0 +1,4 @@
|
||||||
|
Significance: patch
|
||||||
|
Type: tweak
|
||||||
|
|
||||||
|
Assume ambiguous dates passed into DateTimePickerControl are UTC.
|
|
@ -75,20 +75,28 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( {
|
||||||
null
|
null
|
||||||
);
|
);
|
||||||
|
|
||||||
function parseMomentIso( dateString?: string | null ): Moment {
|
function parseMomentIso(
|
||||||
return moment( dateString, moment.ISO_8601, true );
|
dateString?: string | null,
|
||||||
|
assumeLocalTime = false
|
||||||
|
): Moment {
|
||||||
|
if ( assumeLocalTime ) {
|
||||||
|
return moment( dateString, moment.ISO_8601, true ).utc();
|
||||||
|
}
|
||||||
|
|
||||||
|
return moment.utc( dateString, moment.ISO_8601, true );
|
||||||
}
|
}
|
||||||
|
|
||||||
function parseMoment( dateString?: string | null ): Moment {
|
function parseMoment( dateString?: string | null ): Moment {
|
||||||
|
// parse input date string as local time
|
||||||
return moment( dateString, dateTimeFormat );
|
return moment( dateString, dateTimeFormat );
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatMomentIso( momentDate: Moment ): string {
|
function formatMomentIso( momentDate: Moment ): string {
|
||||||
return momentDate.toISOString();
|
return momentDate.utc().toISOString();
|
||||||
}
|
}
|
||||||
|
|
||||||
function formatMoment( momentDate: Moment ): string {
|
function formatMoment( momentDate: Moment ): string {
|
||||||
return momentDate.format( dateTimeFormat );
|
return momentDate.local().format( dateTimeFormat );
|
||||||
}
|
}
|
||||||
|
|
||||||
function hasFocusLeftInputAndDropdownContent(
|
function hasFocusLeftInputAndDropdownContent(
|
||||||
|
@ -272,8 +280,9 @@ export const DateTimePickerControl: React.FC< DateTimePickerControlProps > = ( {
|
||||||
: undefined
|
: undefined
|
||||||
}
|
}
|
||||||
onChange={ ( date: string ) => {
|
onChange={ ( date: string ) => {
|
||||||
|
// the picker returns the date in local time
|
||||||
const formattedDate = formatMoment(
|
const formattedDate = formatMoment(
|
||||||
parseMomentIso( date )
|
parseMomentIso( date, true )
|
||||||
);
|
);
|
||||||
changeImmediate( formattedDate, true );
|
changeImmediate( formattedDate, true );
|
||||||
} }
|
} }
|
||||||
|
|
|
@ -106,6 +106,46 @@ describe( 'DateTimePickerControl', () => {
|
||||||
);
|
);
|
||||||
} );
|
} );
|
||||||
|
|
||||||
|
it( 'should assume ambiguous dates are UTC', () => {
|
||||||
|
const ambiguousISODateTimeString = '2202-09-15T22:30:40';
|
||||||
|
|
||||||
|
const { container } = render(
|
||||||
|
<DateTimePickerControl
|
||||||
|
currentDate={ ambiguousISODateTimeString }
|
||||||
|
is12Hour={ false }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
const input = container.querySelector( 'input' );
|
||||||
|
|
||||||
|
expect( input?.value ).toBe(
|
||||||
|
moment
|
||||||
|
.utc( ambiguousISODateTimeString )
|
||||||
|
.local()
|
||||||
|
.format( default24HourDateTimeFormat )
|
||||||
|
);
|
||||||
|
} );
|
||||||
|
|
||||||
|
it( 'should handle unambiguous UTC dates', () => {
|
||||||
|
const unambiguousISODateTimeString = '2202-09-15T22:30:40Z';
|
||||||
|
|
||||||
|
const { container } = render(
|
||||||
|
<DateTimePickerControl
|
||||||
|
currentDate={ unambiguousISODateTimeString }
|
||||||
|
is12Hour={ false }
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
|
||||||
|
const input = container.querySelector( 'input' );
|
||||||
|
|
||||||
|
expect( input?.value ).toBe(
|
||||||
|
moment
|
||||||
|
.utc( unambiguousISODateTimeString )
|
||||||
|
.local()
|
||||||
|
.format( default24HourDateTimeFormat )
|
||||||
|
);
|
||||||
|
} );
|
||||||
|
|
||||||
it( 'should use the default 12 hour date time format', () => {
|
it( 'should use the default 12 hour date time format', () => {
|
||||||
const dateTime = moment( '2022-09-15 02:30:40' );
|
const dateTime = moment( '2022-09-15 02:30:40' );
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue