|
| 1 | +import { assertNever } from './assertNever.ts'; |
| 2 | +import { dateToIS08601WithTimeZoneOffset } from './dateToIS08601WithTimeZoneOffset.ts'; |
| 3 | + |
| 4 | +/** |
| 5 | + All supported date format strings. This only includes formats we actually use. |
| 6 | + */ |
| 7 | +type DateStringFormat = |
| 8 | + | 'YYYY-MM-DD' |
| 9 | + | 'YYYY-MM-DD HH:mm' |
| 10 | + | 'YYYY-MM-DD HH:mm:ss' |
| 11 | + | 'YYYYMMDD'; // because sometimes... you know :-/ |
| 12 | + |
| 13 | +/** |
| 14 | + Returns a string expressing a date (the current date, unless otherwise specified) in a particular format. |
| 15 | + */ |
| 16 | +export const dateToFormat = (format: DateStringFormat, date?: Date) => |
| 17 | +{ |
| 18 | + const fullDateString = dateToIS08601WithTimeZoneOffset(date); |
| 19 | + const [dateString, timeString] = fullDateString.split('T'); |
| 20 | + const [year, month, day] = dateString.split('-'); |
| 21 | + |
| 22 | + const timeComponents = timeString.split(':'); |
| 23 | + const hour = timeComponents[0]; |
| 24 | + const minute = timeComponents[1]; |
| 25 | + const second = timeComponents[2].substring(0, 2); |
| 26 | + // const _twoDigitYear = year.slice(2); // NEVER! |
| 27 | + const twoDigitMonth = month; |
| 28 | + const twoDigitDay = day; |
| 29 | + const twoDigitHour = hour; |
| 30 | + const twoDigitMinute = minute; |
| 31 | + const twoDigitSecond = second; |
| 32 | + |
| 33 | + switch (format) |
| 34 | + { |
| 35 | + case 'YYYY-MM-DD': |
| 36 | + return `${year}-${twoDigitMonth}-${twoDigitDay}`; |
| 37 | + case 'YYYY-MM-DD HH:mm': |
| 38 | + return `${year}-${twoDigitMonth}-${twoDigitDay} ${twoDigitHour}:${twoDigitMinute}`; |
| 39 | + case 'YYYY-MM-DD HH:mm:ss': |
| 40 | + return `${year}-${twoDigitMonth}-${twoDigitDay} ${twoDigitHour}:${twoDigitMinute}:${twoDigitSecond}`; |
| 41 | + case 'YYYYMMDD': |
| 42 | + return `${year}${twoDigitMonth}${twoDigitDay}`; |
| 43 | + default: |
| 44 | + assertNever(format); |
| 45 | + throw new Error( |
| 46 | + `DateUtils.to(): invariant violation: illegal format: ${format}`, |
| 47 | + ); |
| 48 | + } |
| 49 | +}; |
0 commit comments