diff --git a/src/index.js b/src/index.js
--- a/src/index.js
+++ b/src/index.js
@@ -172,7 +172,7 @@ class Dayjs {
       const argumentStart = [0, 0, 0, 0]
       const argumentEnd = [23, 59, 59, 999]
       return Utils.w(this.toDate()[method].apply( // eslint-disable-line prefer-spread
-        this.toDate(),
+        this.toDate('s'),
         (isStartOf ? argumentStart : argumentEnd).slice(slice)
       ), this)
     }
diff --git a/src/plugin/utc/index.js b/src/plugin/utc/index.js
--- a/src/plugin/utc/index.js
+++ b/src/plugin/utc/index.js
@@ -91,4 +91,12 @@ export default (option, Dayjs, dayjs) => {
   proto.toString = function () {
     return this.toDate().toUTCString()
   }
+
+  const oldToDate = proto.toDate
+  proto.toDate = function (type) {
+    if (type === 's' && this.$offset) {
+      return dayjs(this.format('YYYY-MM-DD HH:mm:ss:SSS')).toDate()
+    }
+    return oldToDate.call(this)
+  }
 }

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
@@ -100,4 +100,11 @@ test('utc startOf', () => {
     .valueOf())
     .toBe(dayjs(d).utc().utcOffset(480).endOf('day')
       .valueOf())
+  const d2 = '2017-07-20T11:00:00+00:00'
+  const d2d = dayjs(d2).utcOffset(-12).startOf('day').valueOf()
+  const d2m = moment(d2).utcOffset(-12).startOf('day').valueOf()
+  expect(d2d)
+    .toBe(d2m)
+  expect(d2d)
+    .toBe(1500465600000)
 })

Format function with setted utcOffset does not work properly
**Describe the bug**
Format function with setted utcOffset does not work properly

**Expected behavior**

dayjs('2017-07-20T11:00:00+00:00').utcOffset(-12).format()

should equal to

moment('2017-07-20T11:00:00+00:00').utcOffset(-12).format()

and be '2017-07-19T23:00:00-12:00'

**Information**
 - Day.js Version v1.8.21
 - OS: Windows
 - Browser Chrome 80
 - Time zone: not zero


seems no problem.

https://runkit.com/embed/32nc6n1cn8s2

<img width="586" alt="Screen Shot 2020-02-29 at 1 06 41 PM" src="https://user-images.githubusercontent.com/17680888/75601243-5f8fc880-5af4-11ea-998d-e30f7185f161.png">

just use the same parameters, begin of day in your case with not zero local time:
https://runkit.com/embed/uhx3pxaltrns

I'm having a similar issue where:
moment.utc("2020-03-09T15:00:00.0000000Z").utcOffset(-360).format();
results in: 
2020-03-09T09:00:00-06:00
while:
dayjs.utc("2020-03-09T15:00:00.0000000Z").utcOffset(-360).format();
results in:
2020-03-09T10:00:00-06:00

https://runkit.com/humbertomendes/dayjs-utcoffset-issue
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