diff --git a/std/datetime/formatter.ts b/std/datetime/formatter.ts index 8b9c9d9b04665f..ea16dbe0d8edf7 100644 --- a/std/datetime/formatter.ts +++ b/std/datetime/formatter.ts @@ -511,6 +511,28 @@ export class DateTimeFormatter { return parts; } + /** sort & filter dateTimeFormatPart */ + sortDateTimeFormatPart(parts: DateTimeFormatPart[]): DateTimeFormatPart[] { + let result: DateTimeFormatPart[] = []; + const typeArray = [ + "year", + "month", + "day", + "hour", + "minute", + "second", + "fractionalSecond", + ]; + for (const type of typeArray) { + const current = parts.findIndex((el) => el.type === type); + if (current !== -1) { + result = result.concat(parts.splice(current, 1)); + } + } + result = result.concat(parts); + return result; + } + partsToDate(parts: DateTimeFormatPart[]): Date { const date = new Date(); const utc = parts.find( @@ -566,6 +588,7 @@ export class DateTimeFormatter { parse(string: string): Date { const parts = this.parseToParts(string); - return this.partsToDate(parts); + const sortParts = this.sortDateTimeFormatPart(parts); + return this.partsToDate(sortParts); } } diff --git a/std/datetime/mod.ts b/std/datetime/mod.ts index 72f8cc6815c4f0..1f117350cbec4b 100644 --- a/std/datetime/mod.ts +++ b/std/datetime/mod.ts @@ -28,7 +28,8 @@ enum Day { export function parse(dateString: string, formatString: string): Date { const formatter = new DateTimeFormatter(formatString); const parts = formatter.parseToParts(dateString); - return formatter.partsToDate(parts); + const sortParts = formatter.sortDateTimeFormatPart(parts); + return formatter.partsToDate(sortParts); } /** diff --git a/std/datetime/test.ts b/std/datetime/test.ts index 0ff70603df7c7d..1b80edd560e451 100644 --- a/std/datetime/test.ts +++ b/std/datetime/test.ts @@ -53,6 +53,10 @@ Deno.test({ datetime.parse("03-01-2019", "dd-MM-yyyy"), new Date(2019, 0, 3), ); + assertEquals( + datetime.parse("31-10-2019", "dd-MM-yyyy"), + new Date(2019, 9, 31), + ); assertEquals( datetime.parse("2019-01-03", "yyyy-MM-dd"), new Date(2019, 0, 3),