diff --git a/src/locale/uk.js b/src/locale/uk.js
--- 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
--- 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
--- 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
--- 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', () => {

CustomParseFormat: Issue with parsing dates in 'D-MM-YYYY' format
**Describe the bug**

```
import dayjs from 'dayjs';
import customParseFormat from 'dayjs/plugin/customParseFormat';

dayjs.extend(customParseFormat);

const date = dayjs('21-Dec-18', 'D-MMM-YY').toJSON()
// Date is Sun Jan 21 2018
```

**Expected behavior**
Date is Sun Dec 21 2018

**Information**
 - Day.js Version: v1.8.27 (The issue does not exist on v1.8.26)
 - OS: macOS Catalina
 - Node.js version: v12
 - Time zone: GMT+2 Central European Summer Time


test/timezone.test.js(1) test/timezone.test.js(2) test/timezone.test.js(3) test/timezone.test.js(4)
test/locale/uk.test.js test/plugin/customParseFormat.test.js