diff --git a/src/constant.js b/src/constant.js
--- a/src/constant.js
+++ b/src/constant.js
@@ -26,5 +26,5 @@ export const FORMAT_DEFAULT = 'YYYY-MM-DDTHH:mm:ssZ'
 export const INVALID_DATE_STRING = 'Invalid Date'
 
 // regex
-export const REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?.?(\d+)?$/
+export const REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?\.?(\d+)?$/
 export const REGEX_FORMAT = /\[([^\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g

diff --git a/test/parse.test.js b/test/parse.test.js
--- a/test/parse.test.js
+++ b/test/parse.test.js
@@ -148,4 +148,34 @@ describe('REGEX_PARSE', () => {
     expect(dayjs(date).valueOf()).toBe(moment(date).valueOf())
     expect(d.join('-')).toBe('2019-03-25T06:41:00.999999999-2019-03-25-06-41-00-999999999')
   })
+  it('20210102T012345', () => {
+    const date = '20210102T012345'
+    const d = date.match(REGEX_PARSE)
+    expect(dayjs(date).valueOf()).toBe(moment(date).valueOf())
+    expect(d.join('-')).toBe('20210102T012345-2021-01-02-01-23-45-')
+  })
+  it('2021-01-02T01:23', () => {
+    const date = '2021-01-02T01:23'
+    const d = date.match(REGEX_PARSE)
+    expect(dayjs(date).valueOf()).toBe(moment(date).valueOf())
+    expect(d.join('-')).toBe('2021-01-02T01:23-2021-01-02-01-23--')
+  })
+  it('2021-01-02T01:23:45', () => {
+    const date = '2021-01-02T01:23:45'
+    const d = date.match(REGEX_PARSE)
+    expect(dayjs(date).valueOf()).toBe(moment(date).valueOf())
+    expect(d.join('-')).toBe('2021-01-02T01:23:45-2021-01-02-01-23-45-')
+  })
+  it('2021-01-02T01:23:45-0500 (no regex match)', () => {
+    const date = '2021-01-02T01:23:45-0500'
+    const d = date.match(REGEX_PARSE)
+    expect(dayjs(date).valueOf()).toBe(moment(date).valueOf())
+    expect(d).toBe(null)
+  })
+  it('2021-01-02T01:23:45Z (no regex match)', () => {
+    const date = '2021-01-02T01:23:45Z'
+    const d = date.match(REGEX_PARSE)
+    expect(dayjs(date).valueOf()).toBe(moment(date).valueOf())
+    expect(d).toBe(null)
+  })
 })

dayjs.utc() dropped timezone offset support
**Describe the bug**
`dayjs.utc('2020-12-01T09:00:00+0900').toDate().getTime() ===  new Date('2020-12-01T09:00:00+0900').getTime()`

**Expected behavior**
The above evaluates to true. It's the behaviour of dayjs 1.8.33.

**Actual behaviour**
```
> dayjs.utc('2020-12-01T09:00:00+0900').toDate()
2020-12-01T09:00:00.090Z
> new Date('2020-12-01T00:00:00+0900')
2020-11-30T15:00:00.000Z
```

**Information**
 - Day.js Version: 1.9.6
 - OS: macOS
 - Browser: 
 - Time zone: GMT+0900 (Korean Standard Time)


```
dayjs.utc('2020-12-01T09:00:00+0900').toDate().getTime() 
   === new Date('2020-12-01T09:00:00+0900').getTime()
   === dayjs('2020-12-01T09:00:00+0900').toDate().getTime() 
```

The above three should have the same result. Cause it represents the same time '2020-12-01T09:00:00+0900'
There was my mistake in the code snippet. I'll explain again.

What I said is your invariant is not established. [codesandbox](https://codesandbox.io/s/elastic-wilbur-pfvvl?file=/src/index.ts)
Interestingly, all of them have different result.
```javascript
// Windows 10 + Chrome 86.0.4240.198
dayjs.utc('2020-12-01T09:00:00+0900').toDate().getTime(): 1606813200090
dayjs    ('2020-12-01T09:00:00+0900').toDate().getTime(): 1606780800090
 new Date('2020-12-01T09:00:00+0900')         .getTime(): 1606780800000
```
This might be a bug in UTC plugin.
Hi. I researched about this issue.
In the case of `'2020-12-01T09:00:00+0900'`, `+0900` is interpreted as a value of miliseconds.
I checked regex constant to parse date string, and it may be wrong that dot character is not escaped.

https://github.com/iamkun/dayjs/blob/17221ec149161e5e87a7b34fb8562d3781913216/src/constant.js#L28-L29
@t-mangoe is correct. To be sure the last digit token in REGEX_PARSE only matches for milliseconds, the period must be escaped. Otherwise, it acts as a wildcard.

To offer some more examples, all of these are the same date/time using different ISO 8601 time zone formats:
`dayjs("2020-12-31T18:00:00.000-0500")`
`dayjs("2020-12-31T18:00:00-05:00")`
`dayjs("2020-12-31T18:00:00-0500")`
The first two parse correctly because REGEX_PARSE doesn't match. But the last example does match REGEX_PARSE, with the `-` character matching the wildcard. So the date is parsed in local time and the first three characters of 0500 become 50ms.

I'm sorry I don't know how to contribute the fix, but the code should read:
`export const REGEX_PARSE = /^(\d{4})[-/]?(\d{1,2})?[-/]?(\d{0,2})[^0-9]*(\d{1,2})?:?(\d{1,2})?:?(\d{1,2})?\.?(\d+)?$/`

Thank you for the library. It's very useful!
test/timezone.test.js(1) test/timezone.test.js(2) test/timezone.test.js(3) test/timezone.test.js(4)
test/parse.test.js