From 20c24d349cd084ab79d8d4d484986faa89d34bbf Mon Sep 17 00:00:00 2001 From: Yihui Liao <44729383+yihuiliao@users.noreply.github.com> Date: Tue, 21 Oct 2025 11:25:47 -0700 Subject: [PATCH 1/2] fix: correctly format date conversion to a string for native date input --- packages/react-aria-components/src/HiddenDateInput.tsx | 7 ++++++- .../react-aria-components/stories/DateField.stories.tsx | 3 +-- .../react-aria-components/stories/DatePicker.stories.tsx | 3 ++- 3 files changed, 9 insertions(+), 4 deletions(-) diff --git a/packages/react-aria-components/src/HiddenDateInput.tsx b/packages/react-aria-components/src/HiddenDateInput.tsx index f0ce4b971b7..7cc3ffc3587 100644 --- a/packages/react-aria-components/src/HiddenDateInput.tsx +++ b/packages/react-aria-components/src/HiddenDateInput.tsx @@ -66,7 +66,12 @@ export function useHiddenDateInput(props: HiddenDateInputProps, state: DateField inputStep = 3600; } - let dateValue = state.value == null ? '' : state.value.toString(); + let dateValue = ''; + if (state.value != null && 'toAbsoluteString' in state.value) { + dateValue = state.value.toAbsoluteString().replace('Z', ''); + } else if (state.value != null) { + dateValue = state.value.toString(); + } let inputType = state.granularity === 'day' ? 'date' : 'datetime-local'; diff --git a/packages/react-aria-components/stories/DateField.stories.tsx b/packages/react-aria-components/stories/DateField.stories.tsx index 3c7ff7cdabc..133fc0602ab 100644 --- a/packages/react-aria-components/stories/DateField.stories.tsx +++ b/packages/react-aria-components/stories/DateField.stories.tsx @@ -94,8 +94,7 @@ export const DateFieldAutoFill = (props) => ( {...props} name="bday" autoComplete="bday" - defaultValue={parseAbsoluteToLocal('2021-04-07T18:45:22Z') - } + defaultValue={parseAbsoluteToLocal('2021-04-07T18:45:22Z')} data-testid="date-field-example"> diff --git a/packages/react-aria-components/stories/DatePicker.stories.tsx b/packages/react-aria-components/stories/DatePicker.stories.tsx index 4838bcffe59..ae079959edf 100644 --- a/packages/react-aria-components/stories/DatePicker.stories.tsx +++ b/packages/react-aria-components/stories/DatePicker.stories.tsx @@ -14,6 +14,7 @@ import {action} from '@storybook/addon-actions'; import {Button, Calendar, CalendarCell, CalendarGrid, DateInput, DatePicker, DateRangePicker, DateSegment, Dialog, Form, Group, Heading, Input, Label, Popover, RangeCalendar, TextField} from 'react-aria-components'; import clsx from 'clsx'; import {Meta, StoryFn} from '@storybook/react'; +import {parseAbsoluteToLocal} from '@internationalized/date'; import React from 'react'; import styles from '../example/index.css'; import './styles.css'; @@ -211,7 +212,7 @@ export const DatePickerAutofill = (props) => ( - + From c2789669e270089ec23f52a3ff39bc96866ebc04 Mon Sep 17 00:00:00 2001 From: Yihui Liao <44729383+yihuiliao@users.noreply.github.com> Date: Wed, 22 Oct 2025 10:44:46 -0700 Subject: [PATCH 2/2] fix --- .../react-aria-components/src/HiddenDateInput.tsx | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/packages/react-aria-components/src/HiddenDateInput.tsx b/packages/react-aria-components/src/HiddenDateInput.tsx index 7cc3ffc3587..c87042dfc1b 100644 --- a/packages/react-aria-components/src/HiddenDateInput.tsx +++ b/packages/react-aria-components/src/HiddenDateInput.tsx @@ -11,7 +11,7 @@ */ -import {CalendarDate, CalendarDateTime, parseDate, parseDateTime} from '@internationalized/date'; +import {CalendarDate, CalendarDateTime, parseDate, parseDateTime, toCalendarDate, toCalendarDateTime, toLocalTimeZone} from '@internationalized/date'; import {DateFieldState, DatePickerState, DateSegmentType} from 'react-stately'; import React, {ReactNode} from 'react'; import {useVisuallyHidden} from 'react-aria'; @@ -65,12 +65,14 @@ export function useHiddenDateInput(props: HiddenDateInputProps, state: DateField } else if (state.granularity === 'hour') { inputStep = 3600; } - + let dateValue = ''; - if (state.value != null && 'toAbsoluteString' in state.value) { - dateValue = state.value.toAbsoluteString().replace('Z', ''); - } else if (state.value != null) { - dateValue = state.value.toString(); + if (state.value) { + if (state.granularity === 'day') { + dateValue = toCalendarDate(state.value).toString(); + } else { + dateValue = toCalendarDateTime('timeZone' in state.value ? toLocalTimeZone(state.value) : state.value).toString(); + } } let inputType = state.granularity === 'day' ? 'date' : 'datetime-local';