| 144 | } |
| 145 | |
| 146 | startOf(units, startOf) { // startOf -> endOf |
| 147 | const isStartOf = !Utils.u(startOf) ? startOf : true |
| 148 | const unit = Utils.p(units) |
| 149 | const instanceFactory = (d, m) => { |
| 150 | const ins = Utils.w(this.$u ? |
| 151 | Date.UTC(this.$y, m, d) : new Date(this.$y, m, d), this) |
| 152 | return isStartOf ? ins : ins.endOf(C.D) |
| 153 | } |
| 154 | const instanceFactorySet = (method, slice) => { |
| 155 | const argumentStart = [0, 0, 0, 0] |
| 156 | const argumentEnd = [23, 59, 59, 999] |
| 157 | return Utils.w(this.toDate()[method].apply( // eslint-disable-line prefer-spread |
| 158 | this.toDate('s'), |
| 159 | (isStartOf ? argumentStart : argumentEnd).slice(slice) |
| 160 | ), this) |
| 161 | } |
| 162 | const { $W, $M, $D } = this |
| 163 | const utcPad = `set${this.$u ? 'UTC' : ''}` |
| 164 | switch (unit) { |
| 165 | case C.Y: |
| 166 | return isStartOf ? instanceFactory(1, 0) : |
| 167 | instanceFactory(31, 11) |
| 168 | case C.M: |
| 169 | return isStartOf ? instanceFactory(1, $M) : |
| 170 | instanceFactory(0, $M + 1) |
| 171 | case C.W: { |
| 172 | const weekStart = this.$locale().weekStart || 0 |
| 173 | const gap = ($W < weekStart ? $W + 7 : $W) - weekStart |
| 174 | return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M) |
| 175 | } |
| 176 | case C.D: |
| 177 | case C.DATE: |
| 178 | return instanceFactorySet(`${utcPad}Hours`, 0) |
| 179 | case C.H: |
| 180 | return instanceFactorySet(`${utcPad}Minutes`, 1) |
| 181 | case C.MIN: |
| 182 | return instanceFactorySet(`${utcPad}Seconds`, 2) |
| 183 | case C.S: |
| 184 | return instanceFactorySet(`${utcPad}Milliseconds`, 3) |
| 185 | default: |
| 186 | return this.clone() |
| 187 | } |
| 188 | } |
| 189 | |
| 190 | endOf(arg) { |
| 191 | return this.startOf(arg, false) |