Skip to content

Commit cd381c2

Browse files
committed
fix
1 parent 58eb16e commit cd381c2

File tree

2 files changed

+21
-12
lines changed

2 files changed

+21
-12
lines changed

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

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,20 @@ 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',
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('en-US', {
23+
day: 'numeric',
24+
hour: '2-digit',
25+
hour12: false,
26+
})).toEqual('14, 20');
27+
expect(toAbsoluteLocaleDate('2024-03-15', 'en-US', {
1928
day: 'numeric',
20-
})).toEqual('Mar 15, 12345');
29+
hour: '2-digit',
30+
hour12: false,
31+
})).toEqual('15, 00');
2132
});

web_src/js/webcomponents/absolute-date.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,9 @@
11
export function toAbsoluteLocaleDate(date: string, lang: string, opts: Intl.DateTimeFormatOptions) {
2-
return new Date(date).toLocaleString(lang || [], opts);
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)