Tweak: improve 2-digit year parsing (#12044)

This commit is contained in:
shamoon
2026-02-08 23:00:00 -08:00
committed by GitHub
parent 4208d9255a
commit 9d7231d2dc
2 changed files with 38 additions and 6 deletions

View File

@@ -70,4 +70,26 @@ describe('LocalizedDateParserFormatter', () => {
dateStr = dateParserFormatter.format(dateStruct)
expect(dateStr).toEqual('04.05.2023')
})
it('should handle years when current year % 100 < 50', () => {
jest.useFakeTimers()
jest.setSystemTime(new Date(2026, 5, 15))
let val = dateParserFormatter.parse('5/4/26')
expect(val).toEqual({ day: 4, month: 5, year: 2026 })
val = dateParserFormatter.parse('5/4/75')
expect(val).toEqual({ day: 4, month: 5, year: 2075 })
val = dateParserFormatter.parse('5/4/99')
expect(val).toEqual({ day: 4, month: 5, year: 1999 })
jest.useRealTimers()
})
it('should handle years when current year % 100 >= 50', () => {
jest.useFakeTimers()
jest.setSystemTime(new Date(2076, 5, 15))
const val = dateParserFormatter.parse('5/4/00')
expect(val).toEqual({ day: 4, month: 5, year: 2100 })
jest.useRealTimers()
})
})

View File

@@ -106,15 +106,25 @@ export class LocalizedDateParserFormatter extends NgbDateParserFormatter {
value = this.preformatDateInput(value)
let match = this.getDateParseRegex().exec(value)
if (match) {
const currentYear = new Date().getFullYear()
const currentCentury = currentYear - (currentYear % 100)
let year = +match.groups.year
if (year < 100) {
let fourDigitYear = currentCentury + year
// Mimic python-dateutil: keep result within -50/+49 years of current year
if (fourDigitYear > currentYear + 49) {
fourDigitYear -= 100
} else if (fourDigitYear <= currentYear - 50) {
fourDigitYear += 100
}
year = fourDigitYear
}
let dateStruct = {
day: +match.groups.day,
month: +match.groups.month,
year: +match.groups.year,
}
if (dateStruct.year <= new Date().getFullYear() - 2000) {
dateStruct.year += 2000
} else if (dateStruct.year < 100) {
dateStruct.year += 1900
year,
}
return dateStruct
} else {