diff --git a/src/plugin/timezone/index.js b/src/plugin/timezone/index.js
--- a/src/plugin/timezone/index.js
+++ b/src/plugin/timezone/index.js
@@ -1,3 +1,5 @@
+import { MIN, MS } from '../../constant'
+
 const typeToPos = {
   year: 0,
   month: 1,
@@ -7,8 +9,6 @@ const typeToPos = {
   second: 5
 }
 
-const ms = 'ms'
-
 // Cache time-zone lookups from Intl.DateTimeFormat,
 // as it is a *very* slow method.
 const dtfCache = {}
@@ -94,10 +94,15 @@ export default (o, c, d) => {
 
   const proto = c.prototype
 
-  proto.tz = function (timezone = defaultTimezone) {
+  proto.tz = function (timezone = defaultTimezone, keepLocalTime) {
+    const oldOffset = this.utcOffset()
     const target = this.toDate().toLocaleString('en-US', { timeZone: timezone })
     const diff = Math.round((this.toDate() - new Date(target)) / 1000 / 60)
-    const ins = d(target).$set(ms, this.$ms).utcOffset(localUtcOffset - diff, true)
+    let ins = d(target).$set(MS, this.$ms).utcOffset(localUtcOffset - diff, true)
+    if (keepLocalTime) {
+      const newOffset = ins.utcOffset()
+      ins = ins.add(oldOffset - newOffset, MIN)
+    }
     ins.$x.$timezone = timezone
     return ins
   }
diff --git a/types/plugin/timezone.d.ts b/types/plugin/timezone.d.ts
--- a/types/plugin/timezone.d.ts
+++ b/types/plugin/timezone.d.ts
@@ -5,7 +5,7 @@ export = plugin
 
 declare module 'dayjs' {
   interface Dayjs {
-    tz(timezone?: string): Dayjs
+    tz(timezone?: string, keepLocalTime?: boolean): Dayjs
   }
 
   interface DayjsTimezone {

diff --git a/test/plugin/timezone.test.js b/test/plugin/timezone.test.js
--- a/test/plugin/timezone.test.js
+++ b/test/plugin/timezone.test.js
@@ -1,8 +1,8 @@
 import MockDate from 'mockdate'
 import moment from 'moment-timezone'
 import dayjs from '../../src'
-import utc from '../../src/plugin/utc'
 import timezone from '../../src/plugin/timezone'
+import utc from '../../src/plugin/utc'
 
 dayjs.extend(utc)
 dayjs.extend(timezone)
@@ -260,6 +260,14 @@ describe('set Default', () => {
   })
 })
 
+describe('keepLocalTime', () => {
+  const base = dayjs.tz('2013-11-18 11:55', 'America/Toronto')
+  it('keepLocalTime', () => {
+    expect(base.tz('Europe/Berlin').format()).toBe('2013-11-18T17:55:00+01:00')
+    expect(base.tz('Europe/Berlin', true).format()).toBe('2013-11-18T11:55:00+01:00')
+  })
+})
+
 describe('Get offsetName', () => {
   const dtz = dayjs.tz('2012-03-11 01:59:59', NY)
   it('short', () => {

Only changing the timezone (similar to moment.tz(keeptime=true))
Here is a code sample from Moment's timezone. I would like to achieve the `true` flag so only the offset changes when time stays the same.
```
var m = moment.tz("2013-11-18 11:55", "America/Toronto");
m.format();                           // 2013-11-18T11:55:00-05:00
m.tz('Europe/Berlin', true).format()  // 2013-11-18T11:55:00+01:00
```

The use case would be:

I have something like an open hour: `08:00` to `16:00`, and want to set that as `America/New_York`, i.e. `8:00 AM EDT` to `16:00PM EDT`.

Current behavior:

```
dayjs("08:00", "hh:mm").tz('America/New_York') => 2020-10-19T11:00:00-04:00 (depending on current timezone, in this case, America/Los_Angeles)
```

Desired behavior:
```
dayjs("08:00", "hh:mm").tz('America/New_York', true) => 2020-10-19T08:00:00-04:00
```



@iamkun bumping this issue. Is this feature already available?
test/timezone.test.js(1) test/timezone.test.js(2) test/timezone.test.js(3) test/timezone.test.js(4)
test/plugin/timezone.test.js