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
@@ -97,7 +97,7 @@ export default (o, c, d) => {
     const date = this.toDate()
     const target = date.toLocaleString('en-US', { timeZone: timezone })
     const diff = Math.round((date - new Date(target)) / 1000 / 60)
-    let ins = d(target).$set(MS, this.$ms)
+    let ins = d(target, { locale: this.$L }).$set(MS, this.$ms)
       .utcOffset((-Math.round(date.getTimezoneOffset() / 15) * 15) - diff, true)
     if (keepLocalTime) {
       const newOffset = ins.utcOffset()
@@ -120,7 +120,7 @@ export default (o, c, d) => {
       return oldStartOf.call(this, units, startOf)
     }
 
-    const withoutTz = d(this.format('YYYY-MM-DD HH:mm:ss:SSS'))
+    const withoutTz = d(this.format('YYYY-MM-DD HH:mm:ss:SSS'), { locale: this.$L })
     const startOfWithoutTz = oldStartOf.call(withoutTz, units, startOf)
     return startOfWithoutTz.tz(this.$x.$timezone, true)
   }

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
@@ -318,4 +318,15 @@ describe('startOf and endOf', () => {
     const endOfDay = originalDay.endOf('day')
     expect(endOfDay.valueOf()).toEqual(originalDay.valueOf())
   })
+
+  it('preserves locality when tz is called', () => {
+    const tzWithoutLocality = dayjs.tz('2023-02-17 00:00:00', NY)
+    const tzWithLocality = dayjs.tz('2023-02-17 00:00:00', NY).locale({
+      name: 'locale_test',
+      weekStart: 3
+    })
+
+    expect(tzWithoutLocality.startOf('week').format('YYYY-MM-DD')).toEqual('2023-02-12')
+    expect(tzWithLocality.startOf('week').format('YYYY-MM-DD')).toEqual('2023-02-15')
+  })
 })

Calling tz() overrides locale
Running
`dayjs('2020-01-08T15:14:59.741774+00:00')
          .locale('es')
          .tz('America/New_York')
          .format('LLL')`
gives `January 8, 2020 10:14 AM` instead of `8 de enero de 2020 10:14`.

However, switching the order of `locale` and `tz`, e.g.
`dayjs('2020-01-08T15:14:59.741774+00:00')
          .tz('America/New_York')
          .locale('es')
          .format('LLL')`
gives the correct result of `8 de enero de 2020 10:14`.

I believe this is the result of the following line of code, which overrides the current locale:
https://github.com/iamkun/dayjs/blob/a9d7d0398d22ebd4bfc3812ca0134a97606d54d9/src/plugin/timezone/index.js#L98

This is the intended behavior or is it something to be fixed to support the provided locale?


I think this issue(#2248) should be checked.
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