diff --git a/src/plugin/duration/index.js b/src/plugin/duration/index.js
--- a/src/plugin/duration/index.js
+++ b/src/plugin/duration/index.js
@@ -48,7 +48,7 @@ class Duration {
       const d = input.match(durationRegex)
       if (d) {
         [,,
-          this.$d.years, this.$d.months,,
+          this.$d.years, this.$d.months, this.$d.weeks,
           this.$d.days, this.$d.hours, this.$d.minutes, this.$d.seconds] = d
         this.calMilliseconds()
         return this
@@ -83,7 +83,7 @@ class Duration {
   toISOString() {
     const Y = this.$d.years ? `${this.$d.years}Y` : ''
     const M = this.$d.months ? `${this.$d.months}M` : ''
-    let days = this.$d.days || 0
+    let days = +this.$d.days || 0
     if (this.$d.weeks) {
       days += this.$d.weeks * 7
     }
diff --git a/src/plugin/localeData/index.js b/src/plugin/localeData/index.js
--- a/src/plugin/localeData/index.js
+++ b/src/plugin/localeData/index.js
@@ -1,11 +1,14 @@
 export default (o, c, dayjs) => { // locale needed later
   const proto = c.prototype
   const getLocalePart = part => (part && (part.indexOf ? part : part.s))
-  const getShort = (ins, target, full, num) => {
+  const getShort = (ins, target, full, num, localeOrder) => {
     const locale = ins.name ? ins : ins.$locale()
     const targetLocale = getLocalePart(locale[target])
     const fullLocale = getLocalePart(locale[full])
-    return targetLocale || fullLocale.map(f => f.substr(0, num))
+    const result = targetLocale || fullLocale.map(f => f.substr(0, num))
+    if (!localeOrder) return result
+    const { weekStart } = locale
+    return result.map((_, index) => (result[(index + (weekStart || 0)) % 7]))
   }
   const getDayjsLocaleObject = () => dayjs.Ls[dayjs.locale()]
   const localeData = function () {
@@ -42,9 +45,9 @@ export default (o, c, dayjs) => { // locale needed later
 
   dayjs.monthsShort = () => getShort(getDayjsLocaleObject(), 'monthsShort', 'months', 3)
 
-  dayjs.weekdays = () => getDayjsLocaleObject().weekdays
+  dayjs.weekdays = localeOrder => getShort(getDayjsLocaleObject(), 'weekdays', null, null, localeOrder)
 
-  dayjs.weekdaysShort = () => getShort(getDayjsLocaleObject(), 'weekdaysShort', 'weekdays', 3)
+  dayjs.weekdaysShort = localeOrder => getShort(getDayjsLocaleObject(), 'weekdaysShort', 'weekdays', 3, localeOrder)
 
-  dayjs.weekdaysMin = () => getShort(getDayjsLocaleObject(), 'weekdaysMin', 'weekdays', 2)
+  dayjs.weekdaysMin = localeOrder => getShort(getDayjsLocaleObject(), 'weekdaysMin', 'weekdays', 2, localeOrder)
 }
diff --git a/types/index.d.ts b/types/index.d.ts
--- a/types/index.d.ts
+++ b/types/index.d.ts
@@ -1,12 +1,17 @@
 /// <reference path="./locale/index.d.ts" />
 
 export = dayjs;
-declare function dayjs (date?: dayjs.ConfigType, option?: dayjs.OptionType, locale?: string): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType, format?: dayjs.OptionType, strict?: boolean): dayjs.Dayjs
+
+declare function dayjs (date?: dayjs.ConfigType, format?: dayjs.OptionType, locale?: string, strict?: boolean): dayjs.Dayjs
 
 declare namespace dayjs {
   export type ConfigType = string | number | Date | Dayjs
 
-  export type OptionType = { locale?: string, format?: string, utc?: boolean } | string
+  export type OptionType = { locale?: string, format?: string, utc?: boolean } | string | string[]
 
   type UnitTypeShort = 'd' | 'M' | 'y' | 'h' | 'm' | 's' | 'ms'
   export type UnitType = 'millisecond' | 'second' | 'minute' | 'hour' | 'day' | 'month' | 'year' | 'date' | UnitTypeShort;

diff --git a/test/plugin/duration.test.js b/test/plugin/duration.test.js
--- a/test/plugin/duration.test.js
+++ b/test/plugin/duration.test.js
@@ -62,6 +62,12 @@ describe('Parse ISO string', () => {
   it('Part ISO string', () => {
     expect(dayjs.duration('PT2777H46M40S').toISOString()).toBe('PT2777H46M40S')
   })
+  it('ISO string with week', () => {
+    const d = dayjs.duration('P2M3W4D')
+    expect(d.toISOString()).toBe('P2M25D')
+    expect(d.asDays()).toBe(85) // moment 85, count 2M as 61 days
+    expect(d.asWeeks()).toBe(12.142857142857142) // moment 12.285714285714286
+  })
   it('Invalid ISO string', () => {
     expect(dayjs.duration('Invalid').toISOString()).toBe('P0D')
   })
diff --git a/test/plugin/localeData.test.js b/test/plugin/localeData.test.js
--- a/test/plugin/localeData.test.js
+++ b/test/plugin/localeData.test.js
@@ -77,3 +77,15 @@ it('Month function', () => {
   expect(dayjs.months()).toEqual(moment.months())
   expect(dayjs.monthsShort()).toEqual(moment.monthsShort())
 })
+
+it('Locale order', () => {
+  dayjs.locale('fr')
+  moment.locale('fr')
+  expect(dayjs.weekdays(true)).toEqual(moment.weekdays(true))
+  expect(dayjs.weekdaysShort(true)).toEqual(moment.weekdaysShort(true))
+  expect(dayjs.weekdaysMin(true)).toEqual(moment.weekdaysMin(true))
+  expect(dayjs.weekdays()).not.toEqual(dayjs.weekdays(true))
+  dayjs.locale('en')
+  moment.locale('en')
+  expect(dayjs.weekdays(true)).toEqual(moment.weekdays(true))
+})

Array format support is not reflected in the type definition for typescript
**Describe the bug**
Array format is supported by #906, but typescript gives the following type error.

```typescript
dayjs('2020-02-02', ['YYYY', 'YYYY-DD-MM'])
```

```
 error TS2345: Argument of type 'string[]' is not assignable to parameter of type 'string | { locale?: string | undefined; format?: string | undefined; utc?: boolean | undefined; } | undefined'.
      Type 'string[]' is not assignable to type 'string'.
```

I think we need to update the function signature for typescript.

**Expected behavior**
It works just as well as javascript

**Information**
 - Day.js Version : 1.8.28
 - OS: macOS



test/timezone.test.js(1) test/timezone.test.js(2) test/timezone.test.js(3) test/timezone.test.js(4)
test/plugin/duration.test.js test/plugin/localeData.test.js