diff --git a/packages/grafana-data/src/datetime/parser.test.ts b/packages/grafana-data/src/datetime/parser.test.ts index f19ddb87ae7..0edfd577612 100644 --- a/packages/grafana-data/src/datetime/parser.test.ts +++ b/packages/grafana-data/src/datetime/parser.test.ts @@ -23,6 +23,18 @@ describe('dateTimeParse', () => { expect(date.format()).toEqual('2020-08-20T10:30:20Z'); }); + it('should be able to parse ISO 8601 date strings when useBrowserLocale is true', () => { + systemDateFormats.update({ + fullDate: 'YYYY-MM-DD HH:mm:ss.SSS', + interval: {} as SystemDateFormatsState['interval'], + useBrowserLocale: true, + }); + + const date = dateTimeParse('2025-03-12T07:09:37.253Z', { timeZone: 'browser' }); + expect(date.isValid()).toBe(true); + expect(date.format()).toEqual('2025-03-12T02:09:37-05:00'); + }); + it('should be able to parse array formats used by calendar', () => { const date = dateTimeParse([2020, 5, 10, 10, 30, 20], { timeZone: 'utc' }); expect(date.format()).toEqual('2020-06-10T10:30:20Z'); diff --git a/packages/grafana-data/src/datetime/parser.ts b/packages/grafana-data/src/datetime/parser.ts index 5e1bf608401..6f3473d7858 100644 --- a/packages/grafana-data/src/datetime/parser.ts +++ b/packages/grafana-data/src/datetime/parser.ts @@ -53,12 +53,12 @@ export const dateTimeParse: DateTimeParser = (value, }; const parseString = (value: string, options?: DateTimeOptionsWhenParsing): DateTime => { + const parsed = parse(value, options?.roundUp, options?.timeZone, options?.fiscalYearStartMonth); if (value.indexOf('now') !== -1) { if (!isValid(value)) { return dateTime(); } - const parsed = parse(value, options?.roundUp, options?.timeZone, options?.fiscalYearStartMonth); return parsed || dateTime(); } @@ -70,6 +70,12 @@ const parseString = (value: string, options?: DateTimeOptionsWhenParsing): DateT return dateTimeForTimeZone(zone.name, value, format); } + if (format === systemDateFormats.fullDate) { + // We use parsed here to handle case when `use_browser_locale` is true + // We need to pass the parsed value to handle case when value is an ISO 8601 date string + return dateTime(parsed, format); + } + switch (lowerCase(timeZone)) { case 'utc': return toUtc(value, format);