Dashboards: Change datemath parse logic so parsed dates always take timezone into account (#88182)

* Dashboards: Change datemath parse logic so parsed dates always take timezone into account
This commit is contained in:
kay delaney 2024-06-27 14:17:21 +01:00 committed by GitHub
parent 0285278cfc
commit 2e0175c3eb
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
3 changed files with 26 additions and 4 deletions

View File

@ -43,9 +43,11 @@ export function parse(
if (isDateTime(text)) { if (isDateTime(text)) {
return text; return text;
} }
if (isDate(text)) { if (isDate(text)) {
return dateTime(text); return dateTime(text);
} }
// We got some non string which is not a moment nor Date. TS should be able to check for that but not always. // We got some non string which is not a moment nor Date. TS should be able to check for that but not always.
return undefined; return undefined;
} else { } else {

View File

@ -231,6 +231,24 @@ describe('timeSrv', () => {
expect(time.raw.from).toBe('now'); expect(time.raw.from).toBe('now');
expect(time.raw.to).toBe('now-1h'); expect(time.raw.to).toBe('now-1h');
}); });
it('should correctly handle timezones', () => {
locationService.push('/d/id?from=1718797457286&to=1718819057286');
_dashboard = {
time: { from: '1718797457286', to: '1718819057286' },
getTimezone: jest.fn(() => 'Africa/Cairo'),
refresh: '',
timeRangeUpdated: jest.fn(() => {}),
timepicker: {},
};
timeSrv = new TimeSrv(new ContextSrvStub());
timeSrv.init(_dashboard);
const time = timeSrv.timeRange();
expect(time.from.toString()).toBe('Wed Jun 19 2024 14:44:17 GMT+0300');
expect(time.to.toString()).toBe('Wed Jun 19 2024 20:44:17 GMT+0300');
});
}); });
}); });

View File

@ -11,6 +11,7 @@ import {
toUtc, toUtc,
IntervalValues, IntervalValues,
AppEvents, AppEvents,
dateTimeForTimeZone,
} from '@grafana/data'; } from '@grafana/data';
import { locationService } from '@grafana/runtime'; import { locationService } from '@grafana/runtime';
import { sceneGraph } from '@grafana/scenes'; import { sceneGraph } from '@grafana/scenes';
@ -106,7 +107,7 @@ export class TimeSrv {
} }
} }
private parseUrlParam(value: string) { private parseUrlParam(value: string, timeZone?: string) {
if (value.indexOf('now') !== -1) { if (value.indexOf('now') !== -1) {
return value; return value;
} }
@ -124,7 +125,7 @@ export class TimeSrv {
if (!isNaN(Number(value))) { if (!isNaN(Number(value))) {
const epoch = parseInt(value, 10); const epoch = parseInt(value, 10);
return toUtc(epoch); return timeZone ? dateTimeForTimeZone(timeZone, epoch) : toUtc(epoch);
} }
return null; return null;
@ -158,12 +159,13 @@ export class TimeSrv {
this.time = this.getTimeWindow(params.get('time')!, params.get('time.window')!); this.time = this.getTimeWindow(params.get('time')!, params.get('time.window')!);
} }
const timeZone = this.timeModel?.getTimezone();
if (params.get('from')) { if (params.get('from')) {
this.time.from = this.parseUrlParam(params.get('from')!) || this.time.from; this.time.from = this.parseUrlParam(params.get('from')!, timeZone) || this.time.from;
} }
if (params.get('to')) { if (params.get('to')) {
this.time.to = this.parseUrlParam(params.get('to')!) || this.time.to; this.time.to = this.parseUrlParam(params.get('to')!, timeZone) || this.time.to;
} }
// if absolute ignore refresh option saved to timeModel // if absolute ignore refresh option saved to timeModel