DateTime: adding support to select preferred timezone for presentation of date and time values. (#23586)
* added moment timezone package. * added a qnd way of selecting timezone. * added a first draft to display how it can be used. * fixed failing tests. * made moment.local to be in utc when running tests. * added tests to verify that the timeZone support works as expected. * Fixed so we use the formatter in the graph context menu. * changed so we will format d3 according to timeZone. * changed from class base to function based for easier consumption. * fixed so tests got green. * renamed to make it shorter. * fixed formatting in logRow. * removed unused value. * added time formatter to flot. * fixed failing tests. * changed so history will use the formatting with support for timezone. * added todo. * added so we append the correct abbrivation behind time. * added time zone abbrevation in timepicker. * adding timezone in rangeutil tool. * will use timezone when formatting range. * changed so we use new functions to format date so timezone is respected. * wip - dashboard settings. * changed so the time picker settings is in react. * added force update. * wip to get the react graph to work. * fixed formatting and parsing on the timepicker. * updated snap to be correct. * fixed so we format values properly in time picker. * make sure we pass timezone on all the proper places. * fixed so we use correct timeZone in explore. * fixed failing tests. * fixed so we always parse from local to selected timezone. * removed unused variable. * reverted back. * trying to fix issue with directive. * fixed issue. * fixed strict null errors. * fixed so we still can select default. * make sure we reads the time zone from getTimezone
This commit is contained in:
@@ -0,0 +1,57 @@
|
||||
/* eslint-disable id-blacklist, no-restricted-imports, @typescript-eslint/ban-types */
|
||||
import moment, { MomentInput } from 'moment-timezone';
|
||||
import { DateTimeInput, DateTime, isDateTime } from './moment_wrapper';
|
||||
import { DateTimeOptions, getTimeZone } from './common';
|
||||
import { parse, isValid } from './datemath';
|
||||
import { lowerCase } from 'lodash';
|
||||
|
||||
export interface DateTimeOptionsWhenParsing extends DateTimeOptions {
|
||||
roundUp?: boolean;
|
||||
}
|
||||
|
||||
export type DateTimeParser<T extends DateTimeOptions = DateTimeOptions> = (
|
||||
value: DateTimeInput,
|
||||
options?: T
|
||||
) => DateTime;
|
||||
|
||||
export const dateTimeParse: DateTimeParser<DateTimeOptionsWhenParsing> = (value, options?): DateTime => {
|
||||
if (isDateTime(value)) {
|
||||
return value;
|
||||
}
|
||||
|
||||
if (typeof value === 'string') {
|
||||
return parseString(value, options);
|
||||
}
|
||||
|
||||
return parseOthers(value, options);
|
||||
};
|
||||
|
||||
const parseString = (value: string, options?: DateTimeOptionsWhenParsing): DateTime => {
|
||||
if (value.indexOf('now') !== -1) {
|
||||
if (!isValid(value)) {
|
||||
return moment() as DateTime;
|
||||
}
|
||||
|
||||
const parsed = parse(value, options?.roundUp, options?.timeZone);
|
||||
return parsed || (moment() as DateTime);
|
||||
}
|
||||
|
||||
return parseOthers(value, options);
|
||||
};
|
||||
|
||||
const parseOthers = (value: DateTimeInput, options?: DateTimeOptionsWhenParsing): DateTime => {
|
||||
const date = value as MomentInput;
|
||||
const timeZone = getTimeZone(options);
|
||||
const zone = moment.tz.zone(timeZone);
|
||||
|
||||
if (zone && zone.name) {
|
||||
return moment.tz(date, zone.name) as DateTime;
|
||||
}
|
||||
|
||||
switch (lowerCase(timeZone)) {
|
||||
case 'utc':
|
||||
return moment.utc(date) as DateTime;
|
||||
default:
|
||||
return moment(date) as DateTime;
|
||||
}
|
||||
};
|
||||
Reference in New Issue
Block a user