From f85bfd941a69c812cb3c765e6508de7d08501cd1 Mon Sep 17 00:00:00 2001 From: greymoth <246701683+greymoth-jp@users.noreply.github.com> Date: Tue, 30 Jun 2026 03:46:24 +0900 Subject: [PATCH] fix(locale): use correct English ordinal in en-ca, en-ie, en-il, en-sg These four English-variant locales kept the placeholder ordinal n => n, so format('Do') returned the bare day number ("21" instead of "21st"). The other English locales (en, en-au, en-gb, en-in, en-nz, en-tt) already use the standard English ordinal function; reuse it here so all English variants agree. Matches moment's ordinal for these locales (see #2878). --- src/locale/en-ca.js | 6 +++++- src/locale/en-ie.js | 6 +++++- src/locale/en-il.js | 6 +++++- src/locale/en-sg.js | 6 +++++- test/locale/en.test.js | 20 ++++++++++++++++++++ 5 files changed, 40 insertions(+), 4 deletions(-) diff --git a/src/locale/en-ca.js b/src/locale/en-ca.js index 6517e00e7..2d73ccf3e 100644 --- a/src/locale/en-ca.js +++ b/src/locale/en-ca.js @@ -8,7 +8,11 @@ const locale = { weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - ordinal: n => n, + ordinal: (n) => { + const s = ['th', 'st', 'nd', 'rd'] + const v = n % 100 + return `[${n}${(s[(v - 20) % 10] || s[v] || s[0])}]` + }, formats: { LT: 'h:mm A', LTS: 'h:mm:ss A', diff --git a/src/locale/en-ie.js b/src/locale/en-ie.js index 5116c251d..82b0de039 100644 --- a/src/locale/en-ie.js +++ b/src/locale/en-ie.js @@ -9,7 +9,11 @@ const locale = { weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - ordinal: n => n, + ordinal: (n) => { + const s = ['th', 'st', 'nd', 'rd'] + const v = n % 100 + return `[${n}${(s[(v - 20) % 10] || s[v] || s[0])}]` + }, formats: { LT: 'HH:mm', LTS: 'HH:mm:ss', diff --git a/src/locale/en-il.js b/src/locale/en-il.js index d19d82008..a0b316d1a 100644 --- a/src/locale/en-il.js +++ b/src/locale/en-il.js @@ -8,7 +8,11 @@ const locale = { weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - ordinal: n => n, + ordinal: (n) => { + const s = ['th', 'st', 'nd', 'rd'] + const v = n % 100 + return `[${n}${(s[(v - 20) % 10] || s[v] || s[0])}]` + }, formats: { LT: 'HH:mm', LTS: 'HH:mm:ss', diff --git a/src/locale/en-sg.js b/src/locale/en-sg.js index 36575d078..5d9d6f98e 100644 --- a/src/locale/en-sg.js +++ b/src/locale/en-sg.js @@ -9,7 +9,11 @@ const locale = { weekdaysShort: 'Sun_Mon_Tue_Wed_Thu_Fri_Sat'.split('_'), monthsShort: 'Jan_Feb_Mar_Apr_May_Jun_Jul_Aug_Sep_Oct_Nov_Dec'.split('_'), weekdaysMin: 'Su_Mo_Tu_We_Th_Fr_Sa'.split('_'), - ordinal: n => n, + ordinal: (n) => { + const s = ['th', 'st', 'nd', 'rd'] + const v = n % 100 + return `[${n}${(s[(v - 20) % 10] || s[v] || s[0])}]` + }, formats: { LT: 'HH:mm', LTS: 'HH:mm:ss', diff --git a/test/locale/en.test.js b/test/locale/en.test.js index c7b3de1b3..76810c5b9 100644 --- a/test/locale/en.test.js +++ b/test/locale/en.test.js @@ -1,11 +1,18 @@ +import moment from 'moment' import dayjs from '../../src' import '../../src/locale/en' import '../../src/locale/en-gb' import '../../src/locale/en-in' import '../../src/locale/en-tt' +import '../../src/locale/en-ca' +import '../../src/locale/en-ie' +import '../../src/locale/en-il' +import '../../src/locale/en-sg' import localizedFormat from '../../src/plugin/localizedFormat' +import advancedFormat from '../../src/plugin/advancedFormat' dayjs.extend(localizedFormat) +dayjs.extend(advancedFormat) const locales = [ { locale: 'en', expectedDate: '12/25/2019' }, @@ -22,3 +29,16 @@ describe('English date formats', () => { }) }) }) + +describe('English ordinal (Do) parity with moment', () => { + const ordinalLocales = ['en-ca', 'en-ie', 'en-il', 'en-sg'] + ordinalLocales.forEach((locale) => { + it(`should format the ordinal day of month like moment - ${locale}`, () => { + for (let d = 1; d <= 31; d += 1) { + const date = `2021-01-${String(d).padStart(2, '0')}` + expect(dayjs(date).locale(locale).format('Do')) + .toEqual(moment(date).locale(locale).format('Do')) + } + }) + }) +})