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
@@ -7,6 +7,8 @@ const typeToPos = {
   second: 5
 }
 
+const ms = 'ms'
+
 export default (o, c, d) => {
   const localUtcOffset = d().utcOffset()
   const tzOffset = (timestamp, timezone) => {
@@ -55,7 +57,7 @@ export default (o, c, d) => {
   proto.tz = function (timezone) {
     const target = this.toDate().toLocaleString('en-US', { timeZone: timezone })
     const diff = Math.round((this.toDate() - new Date(target)) / 1000 / 60)
-    return d(target).utcOffset(localUtcOffset - diff, true)
+    return d(target).utcOffset(localUtcOffset - diff, true).$set(ms, this.$ms)
   }
   d.tz = function (input, timezone) {
     const previousOffset = tzOffset(+d(), timezone)

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
@@ -56,6 +56,14 @@ describe('Parse', () => {
     expect(newYork.tz('America/Los_Angeles').format()).toBe('2014-06-01T09:00:00-07:00')
     expect(newYork.tz('Europe/London').format()).toBe('2014-06-01T17:00:00+01:00')
   })
+
+  it('preserve milliseconds', () => {
+    const d = dayjs(1596735327399)
+    const oldMs = d.millisecond()
+    const dTz = d.tz('America/New_York')
+    const newMs = dTz.millisecond()
+    expect(oldMs).toEqual(newMs)
+  })
 })
 
 describe('Convert', () => {

Changing timezone sets milliseconds to 0
**Describe the bug**
```js
let d = dayjs(1596735327399);
console.log(d.millisecond()); // Will print 399
d = d.tz('America/New_York');
console.log(d.millisecond()); // Will print 0
```

**Expected behavior**
Milliseconds should be preserved.

**Information**
 - Day.js Version: v1.8.33
 - OS: macOS
 - Browser: Chrome 84
 - Time zone: GMT-04:00 DST


Thanks, Fixed.
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