/* eslint-disable eslint-comments/no-unlimited-disable */ /* eslint-disable */ // @ts-nocheck import { addLeadingZeros } from '../../addLeadingZeros/index.ts'; /* * | | Unit | | Unit | * |-----|--------------------------------|-----|--------------------------------| * | a | AM, PM | A* | | * | d | Day of month | D | | * | h | Hour [1-12] | H | Hour [0-23] | * | m | Minute | M | Month | * | s | Second | S | Fraction of second | * | y | Year (abs) | Y | | * * Letters marked by * are not implemented but reserved by Unicode standard. */ export const lightFormatters = { // Year y(date: Date, token: string): string { // From http://www.unicode.org/reports/tr35/tr35-31/tr35-dates.html#Date_Format_tokens // | Year | y | yy | yyy | yyyy | yyyyy | // |----------|-------|----|-------|-------|-------| // | AD 1 | 1 | 01 | 001 | 0001 | 00001 | // | AD 12 | 12 | 12 | 012 | 0012 | 00012 | // | AD 123 | 123 | 23 | 123 | 0123 | 00123 | // | AD 1234 | 1234 | 34 | 1234 | 1234 | 01234 | // | AD 12345 | 12345 | 45 | 12345 | 12345 | 12345 | const signedYear = date.getFullYear(); // Returns 1 for 1 BC (which is year 0 in JavaScript) const year = signedYear > 0 ? signedYear : 1 - signedYear; return addLeadingZeros(token === 'yy' ? year % 100 : year, token.length); }, // Month M(date: Date, token: string): string { const month = date.getMonth(); return token === 'M' ? String(month + 1) : addLeadingZeros(month + 1, 2); }, // Day of the month d(date: Date, token: string): string { return addLeadingZeros(date.getDate(), token.length); }, // AM or PM a(date: Date, token: string): string { // [PATCH:] this hack is required because setHours doesn't work for hours that are close to daylight saving timezone threshold const dayPeriodEnumValue = ((date as any)[Symbol.for('UTCHours')] ?? date.getHours()) / 12 >= 1 ? 'pm' : 'am'; // original: // const dayPeriodEnumValue = date.getHours() / 12 >= 1 ? "pm" : "am"; switch (token) { case 'a': case 'aa': return dayPeriodEnumValue.toUpperCase(); case 'aaa': return dayPeriodEnumValue; case 'aaaaa': return dayPeriodEnumValue[0]; case 'aaaa': default: return dayPeriodEnumValue === 'am' ? 'a.m.' : 'p.m.'; } }, // Hour [1-12] h(date: Date, token: string): string { // [PATCH:] this hack is required because setHours doesn't work for hours that are close to daylight saving timezone threshold return addLeadingZeros(((date as any)[Symbol.for('UTCHours')] ?? date.getHours()) % 12 || 12, token.length); // original: // return addLeadingZeros(date.getHours() % 12 || 12, token.length); }, // Hour [0-23] H(date: Date, token: string): string { // [PATCH:] this hack is required because setHours doesn't work for hours that are close to daylight saving timezone threshold return addLeadingZeros((date as any)[Symbol.for('UTCHours')] ?? date.getHours(), token.length); // original: // return addLeadingZeros(date.getHours(), token.length); }, // Minute m(date: Date, token: string): string { return addLeadingZeros(date.getMinutes(), token.length); }, // Second s(date: Date, token: string): string { return addLeadingZeros(date.getSeconds(), token.length); }, // Fraction of second S(date: Date, token: string): string { const numberOfDigits = token.length; const milliseconds = date.getMilliseconds(); const fractionalSeconds = Math.trunc(milliseconds * Math.pow(10, numberOfDigits - 3)); return addLeadingZeros(fractionalSeconds, token.length); }, }; /* eslint-enable */