diff --git a/src/locale/uk.js b/src/locale/uk.js index 27bfacf1f..e2d6dfe69 100644 --- a/src/locale/uk.js +++ b/src/locale/uk.js @@ -1,6 +1,11 @@ // Ukrainian [uk] import dayjs from 'dayjs' +const monthFormat = 'січня_лютого_березня_квітня_травня_червня_липня_серпня_вересня_жовтня_листопада_грудня'.split('_') +const monthStandalone = 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_') + +const MONTHS_IN_FORMAT = /D[oD]?(\[[^[\]]*\]|\s)+MMMM?/ + function plural(word, num) { const forms = word.split('_') return num % 10 === 1 && num % 100 !== 11 ? forms[0] : (num % 10 >= 2 && num % 10 <= 4 && (num % 100 < 10 || num % 100 >= 20) ? forms[1] : forms[2]) // eslint-disable-line @@ -23,12 +28,21 @@ function relativeTimeWithPlural(number, withoutSuffix, key) { return `${number} ${plural(format[key], +number)}` } +const months = (dayjsInstance, format) => { + if (MONTHS_IN_FORMAT.test(format)) { + return monthFormat[dayjsInstance.month()] + } + return monthStandalone[dayjsInstance.month()] +} +months.s = monthStandalone +months.f = monthFormat + const locale = { name: 'uk', weekdays: 'неділя_понеділок_вівторок_середа_четвер_п’ятниця_субота'.split('_'), weekdaysShort: 'ндл_пнд_втр_срд_чтв_птн_сбт'.split('_'), weekdaysMin: 'нд_пн_вт_ср_чт_пт_сб'.split('_'), - months: 'січень_лютий_березень_квітень_травень_червень_липень_серпень_вересень_жовтень_листопад_грудень'.split('_'), + months, monthsShort: 'сiч_лют_бер_квiт_трав_черв_лип_серп_вер_жовт_лист_груд'.split('_'), weekStart: 1, relativeTime: { diff --git a/src/plugin/customParseFormat/index.js b/src/plugin/customParseFormat/index.js index b8426e7dd..c1c7b85b2 100644 --- a/src/plugin/customParseFormat/index.js +++ b/src/plugin/customParseFormat/index.js @@ -78,19 +78,19 @@ const expressions = { MMM: [matchWord, function (input) { const months = getLocalePart('months') const monthsShort = getLocalePart('monthsShort') - const matchIndex = (monthsShort || months.map(_ => _.substr(0, 3))).indexOf(input) - if (matchIndex < 0) { + const matchIndex = (monthsShort || months.map(_ => _.substr(0, 3))).indexOf(input) + 1 + if (matchIndex < 1) { throw new Error() } - this.month = (matchIndex + 1) % 12 + this.month = (matchIndex % 12) || matchIndex }], MMMM: [matchWord, function (input) { const months = getLocalePart('months') - const matchIndex = months.indexOf(input) - if (matchIndex < 0) { + const matchIndex = months.indexOf(input) + 1 + if (matchIndex < 1) { throw new Error() } - this.month = (matchIndex + 1) % 12 + this.month = (matchIndex % 12) || matchIndex }], Y: [matchSigned, addInput('year')], YY: [match2, function (input) { diff --git a/test/locale/uk.test.js b/test/locale/uk.test.js index e1a88be21..55b4b35de 100644 --- a/test/locale/uk.test.js +++ b/test/locale/uk.test.js @@ -14,6 +14,19 @@ afterEach(() => { MockDate.reset() }) +it('Format Month with locale function', () => { + for (let i = 0; i <= 7; i += 1) { + const dayjsUK = dayjs().locale('uk').add(i, 'day') + const momentUK = moment().locale('uk').add(i, 'day') + const testFormat1 = 'DD MMMM YYYY MMM' + const testFormat2 = 'MMMM' + const testFormat3 = 'MMM' + expect(dayjsUK.format(testFormat1)).toEqual(momentUK.format(testFormat1)) + expect(dayjsUK.format(testFormat2)).toEqual(momentUK.format(testFormat2)) + expect(dayjsUK.format(testFormat3)).toEqual(momentUK.format(testFormat3)) + } +}) + it('RelativeTime: Time from X', () => { const T = [ [44.4, 'second'], // a few seconds diff --git a/test/plugin/customParseFormat.test.js b/test/plugin/customParseFormat.test.js index 2f315063c..14dd830d3 100644 --- a/test/plugin/customParseFormat.test.js +++ b/test/plugin/customParseFormat.test.js @@ -31,6 +31,9 @@ it('parse string for MMM month format', () => { const input = '4/Mar/2019:11:16:26 +0800' const format = 'D/MMM/YYYY:H:m:s zz' expect(dayjs(input, format).valueOf()).toBe(moment(input, format).valueOf()) + const input2 = '21-Dec-18' + const format2 = 'D-MMM-YY' + expect(dayjs(input2, format2).valueOf()).toBe(moment(input2, format2).valueOf()) }) it('parse string January (getMonth() = 0)', () => { @@ -135,6 +138,9 @@ it('parse month from string', () => { const input = '2018 February 03' const format = 'YYYY MMMM DD' expect(dayjs(input, format).valueOf()).toBe(moment(input, format).valueOf()) + const input2 = '21-December-18' + const format2 = 'D-MMMM-YY' + expect(dayjs(input2, format2).valueOf()).toBe(moment(input2, format2).valueOf()) }) it('parse month from short string', () => {