Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
6 changes: 3 additions & 3 deletions packages/date/src/TimezonePickerInput.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,6 @@ import { Select } from '@contentful/f36-components';

import { zoneOffsets, defaultZoneOffset } from './utils/zoneOffsets';


export type TimezonepickerProps = {
disabled: boolean;
onChange: (value: string) => void;
Expand All @@ -23,10 +22,11 @@ export const TimezonepickerInput = ({
isDisabled={disabled}
onChange={(e: ChangeEvent<HTMLSelectElement>) => {
onChange(e.currentTarget.value);
}}>
}}
>
{zoneOffsets.map((offset) => (
<Select.Option key={offset} value={offset}>
UTC{offset}
{offset === defaultZoneOffset ? offset : `UTC${offset}`}
</Select.Option>
))}
</Select>
Expand Down
47 changes: 40 additions & 7 deletions packages/date/src/utils/date.ts
Original file line number Diff line number Diff line change
@@ -1,13 +1,10 @@
// eslint-disable-next-line -- TODO: move to date-fns
import moment from 'moment';
import { TimeResult } from '../types';
import { defaultZoneOffset } from './zoneOffsets';

const ZONE_RX = /(Z|[+-]\d{2}[:+]?\d{2})$/;

function startOfToday(format: string) {
return moment().set({ hours: 0, minutes: 0 }).format(format);
}

function fieldValueToMoment(datetimeString: string | null | undefined): moment.Moment | null {
if (!datetimeString) {
return null;
Expand Down Expand Up @@ -42,9 +39,15 @@ function datetimeFromUserInput(input: TimeResult): {
}

const time = timeFromUserInput(input);
let utcOffset = input.utcOffset;

// If we have the default local offset, compute the local offset for the specified date
if (utcOffset === defaultZoneOffset) {
utcOffset = computeLocalZoneOffset(input.date, time);
}

const date = moment
.parseZone(input.utcOffset, 'Z')
.parseZone(utcOffset, 'Z')
.set(input.date.toObject())
.set({ hours: time.hours(), minutes: time.minutes() });

Expand Down Expand Up @@ -93,7 +96,32 @@ export function getDefaultAMPM() {
}

export function getDefaultUtcOffset() {
return startOfToday('Z');
return defaultZoneOffset;
}

/**
* Compute the local zone offset for the specified date and time.
*
* @param date - The moment object for the date
* @param time - Optional moment with time
* @returns The offset as a string (e.g., "-08:00", "+05:30")
*/
export function computeLocalZoneOffset(date: moment.Moment, time?: moment.Moment): string {
let targetMoment = date.clone();
if (time) {
targetMoment = targetMoment.set({
hour: time.hour(),
minute: time.minute(),
second: 0,
millisecond: 0,
});
} else {
// Default to midnight
targetMoment = targetMoment.startOf('day');
}

// Format as string (e.g., "-08:00", "+05:30")
return targetMoment.format('Z');
}

/**
Expand All @@ -109,12 +137,17 @@ export function userInputFromDatetime({
const datetime = fieldValueToMoment(value);

if (datetime) {
let utcOffset = datetime.format('Z');
const localOffset = computeLocalZoneOffset(datetime);
if (utcOffset === localOffset) {
utcOffset = defaultZoneOffset;
}
const timeFormat = uses12hClock ? 'hh:mm' : 'HH:mm';
return {
date: datetime,
time: datetime.format(timeFormat),
ampm: datetime.format('A'),
utcOffset: datetime.format('Z'),
utcOffset: utcOffset,
};
} else {
return {
Expand Down
3 changes: 2 additions & 1 deletion packages/date/src/utils/zoneOffsets.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
export const defaultZoneOffset = '+00:00';
export const defaultZoneOffset = 'Local time';

export const zoneOffsets = [
'Local time',
'-12:00',
'-11:00',
'-10:00',
Expand Down