| 42 | * //=> Sun Sep 07 2014 00:00:00 |
| 43 | */ |
| 44 | export function setDay< |
| 45 | DateType extends Date, |
| 46 | ResultDate extends Date = DateType, |
| 47 | >( |
| 48 | date: DateArg<DateType>, |
| 49 | day: number, |
| 50 | options?: SetDayOptions<ResultDate>, |
| 51 | ): ResultDate { |
| 52 | const defaultOptions = getDefaultOptions(); |
| 53 | const weekStartsOn = |
| 54 | options?.weekStartsOn ?? |
| 55 | options?.locale?.options?.weekStartsOn ?? |
| 56 | defaultOptions.weekStartsOn ?? |
| 57 | defaultOptions.locale?.options?.weekStartsOn ?? |
| 58 | 0; |
| 59 | |
| 60 | const date_ = toDate(date, options?.in); |
| 61 | const currentDay = date_.getDay(); |
| 62 | |
| 63 | const remainder = day % 7; |
| 64 | const dayIndex = (remainder + 7) % 7; |
| 65 | |
| 66 | const delta = 7 - weekStartsOn; |
| 67 | const diff = |
| 68 | day < 0 || day > 6 |
| 69 | ? day - ((currentDay + delta) % 7) |
| 70 | : ((dayIndex + delta) % 7) - ((currentDay + delta) % 7); |
| 71 | return addDays(date_, diff, options); |
| 72 | } |