* @see https://httpwg.org/specs/rfc9110.html#preferred.date.format * * @param {string} date * @returns {Date | undefined}
(date)
| 25 | * @returns {Date | undefined} |
| 26 | */ |
| 27 | function parseImfDate (date) { |
| 28 | if ( |
| 29 | date.length !== 29 || |
| 30 | date[4] !== ' ' || |
| 31 | date[7] !== ' ' || |
| 32 | date[11] !== ' ' || |
| 33 | date[16] !== ' ' || |
| 34 | date[19] !== ':' || |
| 35 | date[22] !== ':' || |
| 36 | date[25] !== ' ' || |
| 37 | date[26] !== 'G' || |
| 38 | date[27] !== 'M' || |
| 39 | date[28] !== 'T' |
| 40 | ) { |
| 41 | return undefined |
| 42 | } |
| 43 | |
| 44 | let weekday = -1 |
| 45 | if (date[0] === 'S' && date[1] === 'u' && date[2] === 'n') { // Sunday |
| 46 | weekday = 0 |
| 47 | } else if (date[0] === 'M' && date[1] === 'o' && date[2] === 'n') { // Monday |
| 48 | weekday = 1 |
| 49 | } else if (date[0] === 'T' && date[1] === 'u' && date[2] === 'e') { // Tuesday |
| 50 | weekday = 2 |
| 51 | } else if (date[0] === 'W' && date[1] === 'e' && date[2] === 'd') { // Wednesday |
| 52 | weekday = 3 |
| 53 | } else if (date[0] === 'T' && date[1] === 'h' && date[2] === 'u') { // Thursday |
| 54 | weekday = 4 |
| 55 | } else if (date[0] === 'F' && date[1] === 'r' && date[2] === 'i') { // Friday |
| 56 | weekday = 5 |
| 57 | } else if (date[0] === 'S' && date[1] === 'a' && date[2] === 't') { // Saturday |
| 58 | weekday = 6 |
| 59 | } else { |
| 60 | return undefined // Not a valid day of the week |
| 61 | } |
| 62 | |
| 63 | let day = 0 |
| 64 | if (date[5] === '0') { |
| 65 | // Single digit day, e.g. "Sun Nov 6 08:49:37 1994" |
| 66 | const code = date.charCodeAt(6) |
| 67 | if (code < 49 || code > 57) { |
| 68 | return undefined // Not a digit |
| 69 | } |
| 70 | day = code - 48 // Convert ASCII code to number |
| 71 | } else { |
| 72 | const code1 = date.charCodeAt(5) |
| 73 | if (code1 < 49 || code1 > 51) { |
| 74 | return undefined // Not a digit between 1 and 3 |
| 75 | } |
| 76 | const code2 = date.charCodeAt(6) |
| 77 | if (code2 < 48 || code2 > 57) { |
| 78 | return undefined // Not a digit |
| 79 | } |
| 80 | day = (code1 - 48) * 10 + (code2 - 48) // Convert ASCII codes to number |
| 81 | } |
| 82 | |
| 83 | let monthIdx = -1 |
| 84 | if ( |