Skip to content

Commit 3fad332

Browse files
committed
fix
1 parent 58eb16e commit 3fad332

File tree

2 files changed

+15
-14
lines changed

2 files changed

+15
-14
lines changed

web_src/js/webcomponents/absolute-date.test.ts

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,12 @@ test('toAbsoluteLocaleDate', () => {
1313
day: 'numeric',
1414
})).toEqual('15. März 2024');
1515

16-
expect(toAbsoluteLocaleDate('12345-03-15 01:02:03', '', {
17-
year: 'numeric',
18-
month: 'short',
19-
day: 'numeric',
20-
})).toEqual('Mar 15, 12345');
16+
// these cases shouldn't happen
17+
expect(toAbsoluteLocaleDate('2024-03-15 01:02:03', '', {})).toEqual('Invalid Date');
18+
expect(toAbsoluteLocaleDate('10000-01-01', '', {})).toEqual('Invalid Date');
19+
20+
// test different timezone
21+
process.env.TZ = 'America/New_York';
22+
expect(new Date('2024-03-15').toLocaleString()).toEqual('3/14/2024, 8:00:00 PM');
23+
expect(toAbsoluteLocaleDate('2024-03-15')).toEqual('3/15/2024, 12:00:00 AM');
2124
});

web_src/js/webcomponents/absolute-date.ts

Lines changed: 7 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
1-
export function toAbsoluteLocaleDate(date: string, lang: string, opts: Intl.DateTimeFormatOptions) {
2-
return new Date(date).toLocaleString(lang || [], opts);
1+
export function toAbsoluteLocaleDate(date: string, lang?: string, opts?: Intl.DateTimeFormatOptions) {
2+
// only use the date part, it is guaranteed to be in ISO format (YYYY-MM-DDTHH:mm:ss.sssZ) or (YYYY-MM-DD)
3+
// if there is an "Invalid Date" error, there must be something wrong in code and should be fixed.
4+
const dateSep = date.indexOf('T');
5+
date = dateSep === -1 ? date : date.substring(0, dateSep);
6+
return new Date(`${date}T00:00:00`).toLocaleString(lang || [], opts);
37
}
48

59
window.customElements.define('absolute-date', class extends HTMLElement {
@@ -15,14 +19,8 @@ window.customElements.define('absolute-date', class extends HTMLElement {
1519
const lang = this.closest('[lang]')?.getAttribute('lang') ||
1620
this.ownerDocument.documentElement.getAttribute('lang') || '';
1721

18-
// only use the date part, it is guaranteed to be in ISO format (YYYY-MM-DDTHH:mm:ss.sssZ)
19-
let date = this.getAttribute('date');
20-
let dateSep = date.indexOf('T');
21-
dateSep = dateSep === -1 ? date.indexOf(' ') : dateSep;
22-
date = dateSep === -1 ? date : date.substring(0, dateSep);
23-
2422
if (!this.shadowRoot) this.attachShadow({mode: 'open'});
25-
this.shadowRoot.textContent = toAbsoluteLocaleDate(date, lang, opt);
23+
this.shadowRoot.textContent = toAbsoluteLocaleDate(this.getAttribute('date'), lang, opt);
2624
};
2725

2826
attributeChangedCallback(_name, oldValue, newValue) {

0 commit comments

Comments
 (0)