Skip to content

Commit f52eeb9

Browse files
committed
Fix timezone inconsistency between query date fields and graph based time picker
Affects issues: - Fixed #4317
1 parent 943a964 commit f52eeb9

File tree

2 files changed

+35
-20
lines changed

2 files changed

+35
-20
lines changed

Plan/react/dashboard/src/components/cards/query/QueryOptionsCard.jsx

Lines changed: 16 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -21,28 +21,30 @@ import {useQueryResultContext} from "../../../hooks/queryResultContext";
2121
import {useNavigate} from "react-router";
2222
import {useNavigation} from "../../../hooks/navigationHook.jsx";
2323
import ActionButton from "../../input/button/ActionButton.jsx";
24+
import {useMetadata} from "../../../hooks/metadataHook.jsx";
2425

25-
const parseTime = (dateString, timeString) => {
26+
const parseTimeAsUTC = (dateString, timeString) => {
2627
const d = dateString.match(
2728
/^(0\d|\d{2})[/|-]?(0\d|\d{2})[/|-]?(\d{4,5})$/
2829
);
2930
const t = timeString.match(/^(0\d|\d{2}):?(0\d|\d{2})$/);
3031

3132
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
32-
const parsedDay = Number(d[1]);
33-
const parsedMonth = Number(d[2]) - 1; // 0=January, 11=December
34-
const parsedYear = Number(d[3]);
35-
let hour = Number(t[1]);
36-
let minute = Number(t[2]);
37-
const date = new Date(parsedYear, parsedMonth, parsedDay, hour, minute);
38-
return date.getTime() - (date.getTimezoneOffset() * 60000);
33+
const year = d[3];
34+
const month = d[2];
35+
const day = d[1];
36+
const hour = t[1];
37+
const minute = t[2];
38+
const date = new Date(`${year}-${month}-${day}T${hour}:${minute}:00+0000`);
39+
return date.getTime();
3940
};
4041

4142
const QueryOptionsCard = () => {
4243
const {t} = useTranslation();
4344
const navigate = useNavigate()
4445
const {result, setResult} = useQueryResultContext();
4546
const {setCurrentTab} = useNavigation();
47+
const {timeZoneOffsetMinutes} = useMetadata();
4648

4749
const [loadingResults, setLoadingResults] = useState(false);
4850

@@ -78,11 +80,11 @@ const QueryOptionsCard = () => {
7880
if (!fromDate && !fromTime && !toDate && !toTime) return;
7981

8082
setExtremes({
81-
min: parseTime(
83+
min: parseTimeAsUTC(
8284
fromDate || options.view.afterDate,
8385
fromTime || options.view.afterTime
8486
),
85-
max: parseTime(
87+
max: parseTimeAsUTC(
8688
toDate || options.view.beforeDate,
8789
toTime || options.view.beforeTime
8890
)
@@ -94,9 +96,9 @@ const QueryOptionsCard = () => {
9496
const onSetExtremes = useCallback((event) => {
9597
if (event?.trigger) {
9698
const afterDate = Highcharts.dateFormat('%d/%m/%Y', event.min);
97-
const afterTime = Highcharts.dateFormat('%H:%M', event.min);
99+
const afterTime = Highcharts.dateFormat('%H:%M', event.min - timeZoneOffsetMinutes * 60000);
98100
const beforeDate = Highcharts.dateFormat('%d/%m/%Y', event.max);
99-
const beforeTime = Highcharts.dateFormat('%H:%M', event.max);
101+
const beforeTime = Highcharts.dateFormat('%H:%M', event.max - timeZoneOffsetMinutes * 60000);
100102
setFromDate(afterDate);
101103
setFromTime(afterTime);
102104
setToDate(beforeDate);
@@ -119,11 +121,11 @@ const QueryOptionsCard = () => {
119121
setFilters(existingFilters);
120122

121123
setExtremes({
122-
min: parseTime(
124+
min: parseTimeAsUTC(
123125
result.view.afterDate || options.view.afterDate,
124126
result.view.afterTime || options.view.afterTime
125127
),
126-
max: parseTime(
128+
max: parseTimeAsUTC(
127129
result.view.beforeDate || options.view.beforeDate,
128130
result.view.beforeTime || options.view.beforeTime
129131
)

Plan/react/dashboard/src/components/input/DateInputField.jsx

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,16 +17,29 @@ const isValidDate = value => {
1717
};
1818

1919
const correctDate = value => {
20-
const d = value.match(
20+
const ddmmyyyy = value.match(
2121
/^(0\d|\d{2})[/|-]?(0\d|\d{2})[/|-]?(\d{4,5})$/
2222
);
23-
if (!d) return value;
23+
const yyyymmdd = value.match(
24+
/^(\d{4,5})[/|-](0\d|\d{2})[/|-]?(0\d|\d{2})$/
25+
);
26+
if (!ddmmyyyy && !yyyymmdd) return value;
2427

2528
// https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Date/Date
26-
const parsedDay = Number(d[1]);
27-
const parsedMonth = Number(d[2]) - 1; // 0=January, 11=December
28-
const parsedYear = Number(d[3]);
29-
const date = d ? new Date(parsedYear, parsedMonth, parsedDay) : null;
29+
let date = null;
30+
if (ddmmyyyy) {
31+
const day = Number(ddmmyyyy[1]);
32+
const month = Number(ddmmyyyy[2]) - 1; // 0=January, 11=December
33+
const year = Number(ddmmyyyy[3]);
34+
date = new Date(year, month, day);
35+
}
36+
if (yyyymmdd) {
37+
const year = Number(yyyymmdd[1]);
38+
const month = Number(yyyymmdd[2]) - 1; // 0=January, 11=December
39+
const day = Number(yyyymmdd[3]);
40+
date = new Date(year, month, day);
41+
}
42+
if (!date) return value;
3043

3144
const day = `${date.getDate()}`;
3245
const month = `${date.getMonth() + 1}`;

0 commit comments

Comments
 (0)