diff --git a/src/index.js b/src/index.js
--- a/src/index.js
+++ b/src/index.js
@@ -229,7 +229,7 @@ class Dayjs {
       const date = this.clone().set(C.DATE, 1)
       date.$d[name](arg)
       date.init()
-      this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).toDate()
+      this.$d = date.set(C.DATE, Math.min(this.$D, date.daysInMonth())).$d
     } else if (name) this.$d[name](arg)
 
     this.init()

diff --git a/test/plugin/utc-utcOffset.test.js b/test/plugin/utc-utcOffset.test.js
--- a/test/plugin/utc-utcOffset.test.js
+++ b/test/plugin/utc-utcOffset.test.js
@@ -48,7 +48,7 @@ it('clone', () => {
 
 it('immutable', () => {
   const d = dayjs()
-  const du = d.utcOffset(9)
+  const du = d.utcOffset(d.utcOffset() + 1)
   expect(d.utcOffset()).not.toBe(du.utcOffset())
   expect(d.format()).not.toBe(du.format())
 })
@@ -76,6 +76,30 @@ test('change hours when changing the utc offset in UTC mode', () => {
   expect(d.utcOffset(-1380).format('HH:mm')).toBe('07:31')
 })
 
+test('correctly set and add hours in offset mode', () => {
+  const d10 = dayjs('2000-01-30T06:31:00+10:00').utcOffset(10)
+  const dm8 = dayjs('2000-01-30T06:31:00-08:00').utcOffset(-8)
+
+  expect(d10.hour(5).hour()).toBe(5)
+  expect(d10.hour(5).add(1, 'hour').hour()).toBe(6)
+  expect(d10.hour(5).add(-10, 'hour').hour()).toBe(19)
+
+  expect(dm8.hour(5).hour()).toBe(5)
+  expect(dm8.hour(5).add(1, 'hour').hour()).toBe(6)
+  expect(dm8.hour(5).add(-10, 'hour').hour()).toBe(19)
+})
+
+test('keep hours when adding month in offset mode', () => {
+  const d10 = dayjs('2000-01-30T06:31:00+10:00').utcOffset(10)
+  const dm8 = dayjs('2000-01-30T06:31:00-08:00').utcOffset(-8)
+
+  expect(d10.add(1, 'month').hour()).toBe(6)
+  expect(dm8.add(1, 'month').hour()).toBe(6)
+
+  expect(d10.add(-2, 'month').hour()).toBe(6)
+  expect(dm8.add(-2, 'month').hour()).toBe(6)
+})
+
 test('utc costrustor', () => {
   const d = new Date(2019, 8, 11, 0, 0, 0).getTime()
   expect(moment(d).utc().utcOffset(480).valueOf())

add month will change hour when use utcOffset
**Describe the bug**
z = dayjs().utcOffset(-480);
z.hour() !== z.add(0, 'month').hour() // true

**Expected behavior**
z.hour() !== z.add(0, 'month').hour() // false

**Information**
 - Day.js Version 1.8.29
 - OS: MacOS 10.14.5
 - Browser chrome 83
 - Time zone: GMT+08:00


test/timezone.test.js(1) test/timezone.test.js(2) test/timezone.test.js(3) test/timezone.test.js(4)
test/plugin/utc-utcOffset.test.js