diff --git a/src/index.js b/src/index.js
--- a/src/index.js
+++ b/src/index.js
@@ -38,7 +38,12 @@ const dayjs = (date, c, pl) => {
   return new Dayjs(cfg) // eslint-disable-line no-use-before-define
 }
 
-const wrapper = (date, instance) => dayjs(date, { locale: instance.$L, utc: instance.$u })
+const wrapper = (date, instance) =>
+  dayjs(date, {
+    locale: instance.$L,
+    utc: instance.$u,
+    $offset: instance.$offset // todo: refactor; do not use this.$offset in you code
+  })
 
 const Utils = U // for plugin use
 Utils.l = parseLocale
@@ -263,7 +268,7 @@ class Dayjs {
       [C.S]: C.MILLISECONDS_A_SECOND
     }[unit] || 1 // ms
 
-    const nextTimeStamp = this.valueOf() + (number * step)
+    const nextTimeStamp = this.$d.getTime() + (number * step)
     return Utils.w(nextTimeStamp, this)
   }
 
@@ -366,11 +371,11 @@ class Dayjs {
   }
 
   clone() {
-    return Utils.w(this.toDate(), this)
+    return Utils.w(this.$d, this)
   }
 
   toDate() {
-    return new Date(this.$d)
+    return new Date(this.valueOf())
   }
 
   toJSON() {
diff --git a/src/locale/ka.js b/src/locale/ka.js
--- a/src/locale/ka.js
+++ b/src/locale/ka.js
@@ -2,7 +2,7 @@ import dayjs from 'dayjs'
 
 const locale = {
   name: 'ka',
-  weekdays: 'კვირა_ორშაბათი_სამშაბათი_გარემო_ხუთშაბათი_პარასკევი_შაბათს'.split('_'),
+  weekdays: 'კვირა_ორშაბათი_სამშაბათი_ოთხშაბათი_ხუთშაბათი_პარასკევი_შაბათი'.split('_'),
   weekdaysShort: 'კვი_ორშ_სამ_ოთხ_ხუთ_პარ_შაბ'.split('_'),
   weekdaysMin: 'კვ_ორ_სა_ოთ_ხუ_პა_შა'.split('_'),
   months: 'იანვარი_თებერვალი_მარტი_აპრილი_მაისი_ივნისი_ივლისი_აგვისტო_სექტემბერი_ოქტომბერი_ნოემბერი_დეკემბერი'.split('_'),
diff --git a/src/locale/nb.js b/src/locale/nb.js
--- a/src/locale/nb.js
+++ b/src/locale/nb.js
@@ -19,7 +19,7 @@ const locale = {
   },
   relativeTime: {
     future: 'om %s',
-    past: 'for %s siden',
+    past: '%s siden',
     s: 'noen sekunder',
     m: 'ett minutt',
     mm: '%d minutter',
diff --git a/src/locale/pl.js b/src/locale/pl.js
--- a/src/locale/pl.js
+++ b/src/locale/pl.js
@@ -17,8 +17,8 @@ const locale = {
     mm: '%d minut',
     h: 'godzina',
     hh: '%d godzin',
-    d: 'tydzień',
-    dd: '%d tygodni',
+    d: 'dzień',
+    dd: '%d dni',
     M: 'miesiąc',
     MM: '%d miesięcy',
     y: 'rok',
diff --git a/src/locale/uk.js b/src/locale/uk.js
--- a/src/locale/uk.js
+++ b/src/locale/uk.js
@@ -10,7 +10,7 @@ const locale = {
   weekStart: 1,
   relativeTime: {
     future: 'через %s',
-    past: '%s назад',
+    past: '%s тому',
     s: 'декілька секунд',
     m: 'хвилина',
     mm: '%d хвилин',
diff --git a/src/plugin/advancedFormat/index.js b/src/plugin/advancedFormat/index.js
--- a/src/plugin/advancedFormat/index.js
+++ b/src/plugin/advancedFormat/index.js
@@ -13,7 +13,7 @@ export default (o, c, d) => { // locale needed later
     const locale = this.$locale()
     const utils = this.$utils()
     const str = formatStr || FORMAT_DEFAULT
-    const result = str.replace(/\[([^\]]+)]|Q|wo|gggg|Do|X|x|k{1,2}|S/g, (match) => {
+    const result = str.replace(/\[([^\]]+)]|Q|wo|ww|w|gggg|Do|X|x|k{1,2}|S/g, (match) => {
       switch (match) {
         case 'Q':
           return Math.ceil((this.$M + 1) / 3)
@@ -23,6 +23,9 @@ export default (o, c, d) => { // locale needed later
           return this.weekYear()
         case 'wo':
           return locale.ordinal(this.week(), 'W') // W for week
+        case 'w':
+        case 'ww':
+          return utils.s(this.week(), match === 'w' ? 1 : 2, '0')
         case 'k':
         case 'kk':
           return utils.s(String(this.$H === 0 ? 24 : this.$H), match === 'k' ? 1 : 2, '0')
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
@@ -1,4 +1,7 @@
+import { MILLISECONDS_A_MINUTE, MIN } from '../../constant'
+
 export default (option, Dayjs, dayjs) => {
+  const localOffset = (new Date()).getTimezoneOffset()
   const proto = Dayjs.prototype
   dayjs.utc = function (date, format) {
     const cfg = { date, utc: true, format }
@@ -18,6 +21,9 @@ export default (option, Dayjs, dayjs) => {
     if (cfg.utc) {
       this.$u = true
     }
+    if (!this.$utils().u(cfg.$offset)) {
+      this.$offset = cfg.$offset
+    }
     oldParse.call(this, cfg)
   }
 
@@ -39,11 +45,26 @@ export default (option, Dayjs, dayjs) => {
   }
 
   const oldUtcOffset = proto.utcOffset
-  proto.utcOffset = function () {
-    if (this.$u) {
-      return 0
+  proto.utcOffset = function (input) {
+    const { u } = this.$utils()
+    if (u(input)) {
+      if (this.$u) {
+        return 0
+      }
+      if (!u(this.$offset)) {
+        return this.$offset
+      }
+      return oldUtcOffset.call(this)
     }
-    return oldUtcOffset.call(this)
+    const offset = Math.abs(input) <= 16 ? input * 60 : input
+    let ins
+    if (input !== 0) {
+      ins = this.local().add(offset + localOffset, MIN)
+      ins.$offset = offset
+    } else {
+      ins = this.utc()
+    }
+    return ins
   }
 
   const oldFormat = proto.format
@@ -53,7 +74,21 @@ export default (option, Dayjs, dayjs) => {
     return oldFormat.call(this, str)
   }
 
+  proto.valueOf = function () {
+    const addedOffset = !this.$utils().u(this.$offset)
+      ? this.$offset + localOffset : 0
+    return this.$d.valueOf() - (addedOffset * MILLISECONDS_A_MINUTE)
+  }
+
   proto.isUTC = function () {
     return !!this.$u
   }
+
+  proto.toISOString = function () {
+    return this.toDate().toISOString()
+  }
+
+  proto.toString = function () {
+    return this.toDate().toUTCString()
+  }
 }
diff --git a/types/plugin/utc.d.ts b/types/plugin/utc.d.ts
--- a/types/plugin/utc.d.ts
+++ b/types/plugin/utc.d.ts
@@ -11,6 +11,8 @@ declare module 'dayjs' {
     local(): Dayjs
 
     isUTC(): boolean
+
+    utcOffset(offset: number): Dayjs
   }
 
   export function utc(config?: ConfigType, format?: string): Dayjs

diff --git a/test/plugin/utc-utcOffset.test.js b/test/plugin/utc-utcOffset.test.js
new file mode 100644
--- /dev/null
+++ b/test/plugin/utc-utcOffset.test.js
@@ -0,0 +1,103 @@
+import MockDate from 'mockdate'
+import moment from 'moment'
+import dayjs from '../../src'
+import utc from '../../src/plugin/utc'
+
+dayjs.extend(utc)
+
+beforeEach(() => {
+  MockDate.set(new Date())
+})
+
+afterEach(() => {
+  MockDate.reset()
+})
+
+it('Set utcOffset -> Get utcOffset', () => {
+  expect(dayjs().utcOffset(540).utcOffset()).toBe(moment().utcOffset(540).utcOffset())
+  expect(dayjs().utcOffset(540).format()).toBe(moment().utcOffset(540).format())
+  expect(dayjs().utcOffset(60).format()).toBe(moment().utcOffset(60).format())
+  expect(dayjs().utcOffset(8).format()).toBe(moment().utcOffset(8).format())
+
+  expect(dayjs().utcOffset(-540).utcOffset()).toBe(moment().utcOffset(-540).utcOffset())
+  expect(dayjs().utcOffset(-540).format()).toBe(moment().utcOffset(-540).format())
+
+  expect(dayjs().utcOffset(-60).format()).toBe(moment().utcOffset(-60).format())
+  expect(dayjs().utcOffset(-8).format()).toBe(moment().utcOffset(-8).format())
+})
+
+it('valueOf, toDate, toString, toISOString should be the same as original', () => {
+  const d = dayjs()
+  const du = dayjs().utcOffset(9)
+  const mu = moment().utcOffset(9)
+  expect(d.valueOf()).toBe(du.valueOf())
+  expect(du.valueOf()).toBe(mu.valueOf())
+  expect(d.toDate()).toEqual(du.toDate())
+  expect(du.toDate()).toEqual(mu.toDate())
+  expect(du.toISOString()).toEqual(mu.toISOString())
+  expect(d.toString()).toEqual(d.toString())
+})
+
+it('clone', () => {
+  const du = dayjs().utcOffset(9)
+  const duClone = du.clone()
+  expect(du.valueOf()).toBe(duClone.valueOf())
+  expect(du.format()).toBe(duClone.format())
+  expect(du.utcOffset()).toBe(duClone.utcOffset())
+})
+
+it('immutable', () => {
+  const d = dayjs()
+  const du = d.utcOffset(9)
+  expect(d.utcOffset()).not.toBe(du.utcOffset())
+  expect(d.format()).not.toBe(du.format())
+})
+
+it('utcOffset(0) enable utc mode', () => {
+  expect(dayjs().utcOffset(0).format()).toBe(moment().utcOffset(0).format())
+  expect(dayjs().utcOffset(0).isUTC()).toBeTruthy()
+})
+
+test('UTC mode', () => {
+  const d = dayjs.utc('2000-01-01T06:00:00Z')
+  expect(d.isUTC()).toBeTruthy()
+  expect(d.utcOffset(0).isUTC()).toBeTruthy()
+  expect(d.utcOffset(1).isUTC()).toBeFalsy()
+})
+
+test('change hours when changing the utc offset in UTC mode', () => {
+  const d = dayjs.utc('2000-01-01T06:31:00Z')
+  expect(d.hour()).toBe(6)
+  expect(d.utcOffset(0).hour()).toBe(6)
+  expect(d.utcOffset(-60).hour()).toBe(5)
+  expect(d.utcOffset(60).hour()).toBe(7)
+  expect(d.utcOffset(-30).format('HH:mm')).toBe('06:01')
+  expect(d.utcOffset(30).format('HH:mm')).toBe('07:01')
+  expect(d.utcOffset(-1380).format('HH:mm')).toBe('07:31')
+})
+
+test('utc costrustor', () => {
+  const d = new Date(2019, 8, 11, 0, 0, 0).getTime()
+  expect(moment(d).utc().utcOffset(480).valueOf())
+    .toBe(dayjs(d).utc().utcOffset(480).valueOf())
+
+  expect(moment(d).utc().local()
+    .utcOffset(480)
+    .valueOf())
+    .toBe(dayjs(d).utc().local()
+      .utcOffset(480)
+      .valueOf())
+})
+
+test('utc startOf', () => {
+  const d = new Date(2019, 8, 11, 0, 0, 0, 0).getTime()
+  expect(moment(d).utc().utcOffset(480).endOf('day')
+    .valueOf())
+    .toBe(dayjs(d).utc().utcOffset(480).endOf('day')
+      .valueOf())
+
+  expect(moment(d).utc().utcOffset(480).endOf('day')
+    .valueOf())
+    .toBe(dayjs(d).utc().utcOffset(480).endOf('day')
+      .valueOf())
+})
diff --git a/test/plugin/weekOfYear.test.js b/test/plugin/weekOfYear.test.js
--- a/test/plugin/weekOfYear.test.js
+++ b/test/plugin/weekOfYear.test.js
@@ -2,8 +2,10 @@ import moment from 'moment'
 import MockDate from 'mockdate'
 import dayjs from '../../src'
 import weekOfYear from '../../src/plugin/weekOfYear'
+import advancedFormat from '../../src/plugin/advancedFormat'
 import '../../src/locale/en-gb'
 
+dayjs.extend(advancedFormat)
 dayjs.extend(weekOfYear)
 
 beforeEach(() => {
@@ -39,3 +41,10 @@ it('Week of year with locale', () => {
   expect(dayjs('2018-12-30').week()).toBe(moment('2018-12-30').week())
   expect(dayjs('2019-12-29').week()).toBe(moment('2019-12-29').week())
 })
+
+it('Format w ww wo', () => {
+  const day = '2019-07-28'
+  const D = dayjs(day)
+  const M = moment(day)
+  expect(D.format('w ww wo')).toBe(M.format('w ww wo'))
+})

dayjs().format('YYYY w Week') error result
**Describe the bug**
使用dayjs().format('YYYY年第w周') 期望可以得到 2019年第29周

**Expected behavior**
使用dayjs().format('YYYY年第w周') 期望可以得到 2019年第29周，实际上却展示为2019年第w周

**Information**
 - Day.js 版本1.8.16
 - OS: Linux
 - Browser   chrome  74.0.3729.131
 - Time zone: GMT+08:00


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 test/plugin/weekOfYear.test.js