Skip to content

Commit

Permalink
refactor: use the centralized 24 hour date/time formatting across com…
Browse files Browse the repository at this point in the history
…ponents
  • Loading branch information
ahmadshaheer committed Jan 27, 2025
1 parent b05f42e commit 94c9fe3
Show file tree
Hide file tree
Showing 43 changed files with 163 additions and 87 deletions.
21 changes: 11 additions & 10 deletions frontend/src/components/CustomTimePicker/CustomTimePicker.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -113,16 +113,17 @@ function CustomTimePicker({
selectedTimeValue: string,
): string => {
if (selectedTime === 'custom') {
// Convert the date range string to 12-hour format
const dates = selectedTimeValue.split(' - ');
if (dates.length === 2) {
const startDate = dayjs(dates[0], 'DD/MM/YYYY HH:mm');
const endDate = dayjs(dates[1], 'DD/MM/YYYY HH:mm');

return `${startDate.format('DD/MM/YYYY hh:mm A')} - ${endDate.format(
'DD/MM/YYYY hh:mm A',
)}`;
}
// TODO(shaheer): if the user preference is 12 hour format, then convert the date range string to 12-hour format (pick this up while working on 12/24 hour preference feature)
// // Convert the date range string to 12-hour format
// const dates = selectedTimeValue.split(' - ');
// if (dates.length === 2) {
// const startDate = dayjs(dates[0], DATE_TIME_FORMATS.UK_DATETIME);
// const endDate = dayjs(dates[1], DATE_TIME_FORMATS.UK_DATETIME);

// return `${startDate.format(DATE_TIME_FORMATS.UK_DATETIME)} - ${endDate.format(
// DATE_TIME_FORMATS.UK_DATETIME,
// )}`;
// }
return selectedTimeValue;
}

Expand Down
8 changes: 3 additions & 5 deletions frontend/src/components/CustomTimePicker/RangePickerModal.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import './RangePickerModal.styles.scss';

import { DatePicker } from 'antd';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { DateTimeRangeType } from 'container/TopNav/CustomDateTimeModal';
import { LexicalContext } from 'container/TopNav/DateTimeSelectionV2/config';
import dayjs, { Dayjs } from 'dayjs';
Expand Down Expand Up @@ -68,12 +69,9 @@ function RangePickerModal(props: RangePickerModalProps): JSX.Element {
<RangePicker
disabledDate={disabledDate}
allowClear
showTime={{
use12Hours: true,
format: 'hh:mm A',
}}
showTime
format={(date: Dayjs): string =>
date.tz(timezone.value).format('YYYY-MM-DD hh:mm A')
date.tz(timezone.value).format(DATE_TIME_FORMATS.ISO_DATETIME)
}
onOk={onModalOkHandler}
// eslint-disable-next-line react/jsx-props-no-spreading
Expand Down
17 changes: 9 additions & 8 deletions frontend/src/components/Graph/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@ import {
Tooltip,
} from 'chart.js';
import annotationPlugin from 'chartjs-plugin-annotation';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { generateGridTitle } from 'container/GridPanelSwitch/utils';
import dayjs from 'dayjs';
import { useIsDarkMode } from 'hooks/useDarkMode';
Expand Down Expand Up @@ -67,13 +68,13 @@ Tooltip.positioners.custom = TooltipPositionHandler;

// Map of Chart.js time formats to dayjs format strings
const formatMap = {
'HH:mm:ss': 'HH:mm:ss',
'HH:mm': 'HH:mm',
'MM/DD HH:mm': 'MM/DD HH:mm',
'MM/dd HH:mm': 'MM/DD HH:mm',
'MM/DD': 'MM/DD',
'YY-MM': 'YY-MM',
YY: 'YY',
'HH:mm:ss': DATE_TIME_FORMATS.TIME_SECONDS,
'HH:mm': DATE_TIME_FORMATS.TIME,
'MM/DD HH:mm': DATE_TIME_FORMATS.SLASH_SHORT,
'MM/dd HH:mm': DATE_TIME_FORMATS.SLASH_SHORT,
'MM/DD': DATE_TIME_FORMATS.DATE_SHORT,
'YY-MM': DATE_TIME_FORMATS.YEAR_MONTH,
YY: DATE_TIME_FORMATS.YEAR_SHORT,
};

const Graph = forwardRef<ToggleGraphProps | undefined, GraphProps>(
Expand Down Expand Up @@ -136,7 +137,7 @@ const Graph = forwardRef<ToggleGraphProps | undefined, GraphProps>(
const format = formatMap[fmt as keyof typeof formatMap];
if (!format) {
console.warn(`Missing datetime format for ${fmt}`);
return dayjsTime.format('YYYY-MM-DD HH:mm:ss'); // fallback format
return dayjsTime.format(DATE_TIME_FORMATS.ISO_DATETIME_SECONDS); // fallback format
}

return dayjsTime.format(format);
Expand Down
21 changes: 12 additions & 9 deletions frontend/src/components/Graph/utils.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import { Chart, ChartConfiguration, ChartData, Color } from 'chart.js';
import * as chartjsAdapter from 'chartjs-adapter-date-fns';
import { Timezone } from 'components/CustomTimePicker/timezoneUtils';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import dayjs from 'dayjs';
import { MutableRefObject } from 'react';

Expand Down Expand Up @@ -99,7 +100,9 @@ export const getGraphOptions = (
callbacks: {
title(context): string | string[] {
const date = dayjs(context[0].parsed.x);
return date.tz(timezone.value).format('MMM DD, YYYY, HH:mm:ss');
return date
.tz(timezone.value)
.format(DATE_TIME_FORMATS.MONTH_DATETIME_FULL_SECONDS);
},
label(context): string | string[] {
let label = context.dataset.label || '';
Expand Down Expand Up @@ -154,14 +157,14 @@ export const getGraphOptions = (
unit: xAxisTimeUnit?.unitName || 'minute',
stepSize: xAxisTimeUnit?.stepSize || 1,
displayFormats: {
millisecond: 'HH:mm:ss',
second: 'HH:mm:ss',
minute: 'HH:mm',
hour: 'MM/dd HH:mm',
day: 'MM/dd',
week: 'MM/dd',
month: 'yy-MM',
year: 'yy',
millisecond: DATE_TIME_FORMATS.TIME_SECONDS,
second: DATE_TIME_FORMATS.TIME_SECONDS,
minute: DATE_TIME_FORMATS.TIME,
hour: DATE_TIME_FORMATS.SLASH_SHORT,
day: DATE_TIME_FORMATS.DATE_SHORT,
week: DATE_TIME_FORMATS.DATE_SHORT,
month: DATE_TIME_FORMATS.YEAR_MONTH,
year: DATE_TIME_FORMATS.YEAR_SHORT,
},
},
type: 'time',
Expand Down
Original file line number Diff line number Diff line change
@@ -1,5 +1,6 @@
import { Tag, Typography } from 'antd';
import { ColumnsType } from 'antd/es/table';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { getMs } from 'container/Trace/Filters/Panel/PanelBody/Duration/util';
import {
BlockLink,
Expand Down Expand Up @@ -33,8 +34,8 @@ export const getListColumns = (
if (key === 'timestamp') {
const date =
typeof value === 'string'
? dayjs(value).format('YYYY-MM-DD HH:mm:ss.SSS')
: dayjs(value / 1e6).format('YYYY-MM-DD HH:mm:ss.SSS');
? dayjs(value).format(DATE_TIME_FORMATS.ISO_DATETIME_MS)
: dayjs(value / 1e6).format(DATE_TIME_FORMATS.ISO_DATETIME_MS);

return (
<BlockLink to={getTraceLink(item)} openInNewTab>
Expand Down
5 changes: 3 additions & 2 deletions frontend/src/components/Logs/ListLogView/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ import { Typography } from 'antd';
import cx from 'classnames';
import LogDetail from 'components/LogDetail';
import { VIEW_TYPES } from 'components/LogDetail/constants';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { unescapeString } from 'container/LogDetailedView/utils';
import { FontSize } from 'container/OptionsMenu/types';
import dompurify from 'dompurify';
Expand Down Expand Up @@ -181,11 +182,11 @@ function ListLogView({
typeof flattenLogData.timestamp === 'string'
? formatTimezoneAdjustedTimestamp(
flattenLogData.timestamp,
'YYYY-MM-DD HH:mm:ss.SSS',
DATE_TIME_FORMATS.ISO_DATETIME_MS,
)
: formatTimezoneAdjustedTimestamp(
flattenLogData.timestamp / 1e6,
'YYYY-MM-DD HH:mm:ss.SSS',
DATE_TIME_FORMATS.ISO_DATETIME_MS,
),
[flattenLogData.timestamp, formatTimezoneAdjustedTimestamp],
);
Expand Down
8 changes: 6 additions & 2 deletions frontend/src/components/Logs/RawLogView/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Convert from 'ansi-to-html';
import { DrawerProps } from 'antd';
import LogDetail from 'components/LogDetail';
import { VIEW_TYPES, VIEWS } from 'components/LogDetail/constants';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { unescapeString } from 'container/LogDetailedView/utils';
import LogsExplorerContext from 'container/LogsExplorerContext';
import dompurify from 'dompurify';
Expand Down Expand Up @@ -94,10 +95,13 @@ function RawLogView({
const text = useMemo(() => {
const date =
typeof data.timestamp === 'string'
? formatTimezoneAdjustedTimestamp(data.timestamp, 'YYYY-MM-DD HH:mm:ss.SSS')
? formatTimezoneAdjustedTimestamp(
data.timestamp,
DATE_TIME_FORMATS.ISO_DATETIME_MS,
)
: formatTimezoneAdjustedTimestamp(
data.timestamp / 1e6,
'YYYY-MM-DD HH:mm:ss.SSS',
DATE_TIME_FORMATS.ISO_DATETIME_MS,
);

return `${date} | ${attributesText} ${data.body}`;
Expand Down
8 changes: 6 additions & 2 deletions frontend/src/components/Logs/TableView/useTableView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import Convert from 'ansi-to-html';
import { Typography } from 'antd';
import { ColumnsType } from 'antd/es/table';
import cx from 'classnames';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { unescapeString } from 'container/LogDetailedView/utils';
import dompurify from 'dompurify';
import { useIsDarkMode } from 'hooks/useDarkMode';
Expand Down Expand Up @@ -99,10 +100,13 @@ export const useTableView = (props: UseTableViewProps): UseTableViewResult => {
render: (field): ColumnTypeRender<Record<string, unknown>> => {
const date =
typeof field === 'string'
? formatTimezoneAdjustedTimestamp(field, 'YYYY-MM-DD HH:mm:ss.SSS')
? formatTimezoneAdjustedTimestamp(
field,
DATE_TIME_FORMATS.ISO_DATETIME_MS,
)
: formatTimezoneAdjustedTimestamp(
field / 1e6,
'YYYY-MM-DD HH:mm:ss.SSS',
DATE_TIME_FORMATS.ISO_DATETIME_MS,
);
return {
children: (
Expand Down
3 changes: 2 additions & 1 deletion frontend/src/components/ResizeTable/TableComponent/Time.tsx
Original file line number Diff line number Diff line change
@@ -1,12 +1,13 @@
import { Typography } from 'antd';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { useTimezone } from 'providers/Timezone';

function Time({ CreatedOrUpdateTime }: DateProps): JSX.Element {
const { formatTimezoneAdjustedTimestamp } = useTimezone();
const time = new Date(CreatedOrUpdateTime);
const timeString = formatTimezoneAdjustedTimestamp(
time,
'MM/DD/YYYY hh:mm:ss A (UTC Z)',
DATE_TIME_FORMATS.UTC_US,
);
return <Typography>{timeString}</Typography>;
}
Expand Down
7 changes: 5 additions & 2 deletions frontend/src/constants/dateTimeFormats.ts
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ export const DATE_TIME_FORMATS = {
ISO_DATETIME_UTC: 'YYYY-MM-DD HH:mm:ss (UTC Z)',

// Standard regional formats
US_DATE: 'MM/DD/YYYY',
UK_DATETIME: 'DD/MM/YYYY HH:mm',
UK_DATETIME_SECONDS: 'DD/MM/YYYY HH:mm:ss',

Expand All @@ -14,7 +15,8 @@ export const DATE_TIME_FORMATS = {
US_DATETIME_SECONDS: 'MM/DD/YYYY, HH:mm:ss',

// Slash formats
// SLASH_DATETIME_SECONDS: 'YYYY/MM/DD HH:mm:ss',
SLASH_DATETIME: 'YYYY/MM/DD HH:mm',
SLASH_DATETIME_SECONDS: 'YYYY/MM/DD HH:mm:ss',
SLASH_SHORT: 'MM/DD HH:mm',

// Time only formats
Expand All @@ -36,6 +38,7 @@ export const DATE_TIME_FORMATS = {
MONTH_DATETIME: 'MMM DD, YYYY, HH:mm',
MONTH_DATETIME_SECONDS: 'MMM DD YYYY HH:mm:ss',
MONTH_DATETIME_FULL: 'MMMM DD, YYYY HH:mm',
MONTH_DATETIME_FULL_SECONDS: 'MMM DD, YYYY, HH:mm:ss',

// Ordinal formats (1st, 2nd, 3rd, etc)
ORDINAL_DATE: 'Do MMM YYYY',
Expand All @@ -49,7 +52,7 @@ export const DATE_TIME_FORMATS = {
UTC_MONTH_FULL: 'MMMM DD, YYYY HH:mm (UTC Z)',
UTC_MONTH_SHORT: 'MMM DD HH:mm:ss.SSS (UTC Z)',
UTC_MONTH_COMPACT: 'MMM DD,YYYY, HH:mm (UTC Z)',
// UTC_TIME_DATE: 'HH:mm:ss (UTC Z) MM/DD',
UTC_TIME_DATE: 'HH:mm:ss (UTC Z) MM/DD',

// Formats with dash separator
DASH_DATETIME: 'MMM D, YYYY ⎯ HH:mm:ss',
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import { ColumnsType } from 'antd/es/table';
import ClientSideQBSearch, {
AttributeKey,
} from 'components/ClientSideQBSearch/ClientSideQBSearch';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { ConditionalAlertPopover } from 'container/AlertHistory/AlertPopover/AlertPopover';
import { transformKeyValuesToAttributeValuesMap } from 'container/QueryBuilder/filters/utils';
import { useIsDarkMode } from 'hooks/useDarkMode';
Expand Down Expand Up @@ -112,7 +113,7 @@ export const timelineTableColumns = ({
width: 200,
render: (value): JSX.Element => (
<div className="alert-rule__created-at">
{formatTimezoneAdjustedTimestamp(value, 'MMM D, YYYY ⎯ HH:mm:ss')}
{formatTimezoneAdjustedTimestamp(value, DATE_TIME_FORMATS.DASH_DATETIME)}
</div>
),
},
Expand Down
6 changes: 5 additions & 1 deletion frontend/src/container/AllError/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@ import logEvent from 'api/common/logEvent';
import getAll from 'api/errors/getAll';
import getErrorCounts from 'api/errors/getErrorCounts';
import { ResizeTable } from 'components/ResizeTable';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import ROUTES from 'constants/routes';
import { useNotifications } from 'hooks/useNotifications';
import useResourceAttribute from 'hooks/useResourceAttribute';
Expand Down Expand Up @@ -164,7 +165,10 @@ function AllErrors(): JSX.Element {
) => string,
): JSX.Element => (
<Typography>
{formatTimezoneAdjustedTimestamp(value, 'DD/MM/YYYY hh:mm:ss A')}
{formatTimezoneAdjustedTimestamp(
value,
DATE_TIME_FORMATS.UK_DATETIME_SECONDS,
)}
</Typography>
);

Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { themeColors } from 'constants/theme';
import dayjs from 'dayjs';
import { generateColor } from 'lib/uPlotLib/utils/generateColor';
Expand All @@ -19,7 +20,9 @@ const tooltipPlugin = (
return value.toFixed(3);
}
if (value instanceof Date) {
return dayjs(value).tz(timezone).format('MM/DD/YYYY, h:mm:ss A');
return dayjs(value)
.tz(timezone)
.format(DATE_TIME_FORMATS.US_DATETIME_SECONDS);
}
if (value == null) {
return 'N/A';
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,4 @@
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import dayjs from 'dayjs';

export interface QuantityData {
Expand Down Expand Up @@ -36,7 +37,7 @@ interface CsvData {
}

const formatDate = (timestamp: number): string =>
dayjs.unix(timestamp).format('MM/DD/YYYY');
dayjs.unix(timestamp).format(DATE_TIME_FORMATS.US_DATE);

const getQuantityData = (
data: QuantityData[],
Expand Down
Original file line number Diff line number Diff line change
@@ -1,4 +1,5 @@
import { UsageResponsePayloadProps } from 'api/billing/getUsage';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import dayjs from 'dayjs';
import { getUPlotChartData } from 'lib/uPlotLib/utils/getUplotChartData';
import { isEmpty, isNull } from 'lodash-es';
Expand Down Expand Up @@ -98,7 +99,7 @@ export function fillMissingValuesForQuantities(
}

const formatDate = (timestamp: number): string =>
dayjs.unix(timestamp).format('MM/DD/YYYY');
dayjs.unix(timestamp).format(DATE_TIME_FORMATS.US_DATE);

export function csvFileName(csvData: QuantityData[]): string {
if (!csvData.length) {
Expand Down
3 changes: 2 additions & 1 deletion frontend/src/container/ErrorDetails/index.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@ import logEvent from 'api/common/logEvent';
import getNextPrevId from 'api/errors/getNextPrevId';
import Editor from 'components/Editor';
import { ResizeTable } from 'components/ResizeTable';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { getNanoSeconds } from 'container/AllError/utils';
import { useNotifications } from 'hooks/useNotifications';
import createQueryParams from 'lib/createQueryParams';
Expand Down Expand Up @@ -148,7 +149,7 @@ function ErrorDetails(props: ErrorDetailsProps): JSX.Element {
<Typography>
{formatTimezoneAdjustedTimestamp(
errorDetail.timestamp,
'DD/MM/YYYY hh:mm:ss A (UTC Z)',
DATE_TIME_FORMATS.UTC_FULL,
)}
</Typography>
</div>
Expand Down
3 changes: 2 additions & 1 deletion frontend/src/container/GantChart/Span/index.tsx
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
import '../GantChart.styles.scss';

import { Popover, Typography } from 'antd';
import { DATE_TIME_FORMATS } from 'constants/dateTimeFormats';
import { convertTimeToRelevantUnit } from 'container/TraceDetail/utils';
import dayjs from 'dayjs';
import { useIsDarkMode } from 'hooks/useDarkMode';
Expand Down Expand Up @@ -43,7 +44,7 @@ function Span(props: SpanLengthProps): JSX.Element {
const getContent = (): JSX.Element => {
const timeStamp = dayjs(startTime)
.tz(timezone.value)
.format('h:mm:ss:SSS A (UTC Z)');
.format(DATE_TIME_FORMATS.TIME_UTC_MS);
const startTimeInMs = startTime - globalStart;
return (
<div>
Expand Down
Loading

0 comments on commit 94c9fe3

Please sign in to comment.