В интерфейсах, связанных с выбором или отображением времени, используются два основных стандарта:
Библиотека React Aria предоставляет инфраструктуру
для создания полностью доступных компонентов времени, которые корректно
работают с обоими форматами. Основная логика основана на международных
стандартах локализации и на утилитах библиотеки
@internationalized/date.
Поддержка разных форматов необходима для:
В React Aria формат времени определяется автоматически на основе локали, однако может контролироваться и программно.
12-часовой формат делит сутки на два периода:
Примеры:
| Время | Значение |
|---|---|
| 12:00 AM | 00:00 |
| 9:30 AM | 09:30 |
| 12:00 PM | 12:00 |
| 7:45 PM | 19:45 |
Особенности формата:
24-часовой формат использует полный диапазон часов суток.
| Время | Значение |
|---|---|
| 00:00 | полночь |
| 09:30 | утро |
| 12:00 | полдень |
| 19:45 | вечер |
Особенности:
React Aria предоставляет несколько компонентов для работы со временем:
Все они используют тип Time из библиотеки
@internationalized/date.
Пример импорта:
import {TimeField} from 'react-aria-components';
import {Time} from '@internationalized/date';
TimeField — основной компонент ввода времени.
Пример:
import {TimeField} from 'react-aria-components';
import {Time} from '@internationalized/date';
export default function Example() {
return (
<TimeField
label="Время"
defaultValue={new Time(9, 30)}
/>
);
}
Компонент автоматически:
Формат времени определяется через Intl API.
React Aria использует:
Intl.DateTimeFormat
Например:
| Локаль | Формат |
|---|---|
| en-US | 12-часовой |
| en-GB | 24-часовой |
| de-DE | 24-часовой |
| fr-FR | 24-часовой |
Пример установки локали:
import {I18nProvider} from 'react-aria-components';
<I18nProvider locale="en-US">
<App />
</I18nProvider>
Теперь все поля времени будут использовать 12-часовой формат.
React Aria позволяет управлять форматом через параметр hourCycle.
Возможные значения:
| Значение | Формат |
|---|---|
| h11 | 0–11 |
| h12 | 1–12 |
| h23 | 0–23 |
| h24 | 1–24 |
Пример:
<TimeField
label="Время"
hourCycle={12}
/>
Это включает отображение AM/PM.
Пример:
<TimeField
label="Время"
hourCycle={24}
/>
Теперь:
React Aria реализует время через сегменты.
Каждая часть времени — отдельный интерактивный элемент:
Пример DOM-структуры:
[09] : [30] [AM]
Каждый сегмент:
Внутри TimeField используются:
DateInputDateSegmentПример кастомной разметки:
import {
TimeField,
Label,
DateInput,
DateSegment
} from 'react-aria-components';
function MyTimeField() {
return (
<TimeField label="Время">
<Label>Время</Label>
<DateInput>
{(segment) => <DateSegment segment={segment} />}
</DateInput>
</TimeField>
);
}
Сегменты автоматически создаются на основе формата времени.
В 12-часовом формате добавляется дополнительный сегмент:
AM/PM
Он также доступен для редактирования.
Пример:
09 : 45 PM
Переход между AM и PM выполняется:
Тип Time хранит:
Пример создания:
new Time(14, 30)
Это значение интерпретируется как:
14:30
При 12-часовом отображении:
2:30 PM
React Aria не требует ручного преобразования.
Компонент сам отображает:
Хранение всегда происходит в 24-часовом виде.
Это упрощает:
Можно задать диапазон доступного времени.
Пример:
<TimeField
label="Рабочее время"
minValue={new Time(9)}
maxValue={new Time(18)}
/>
Теперь допустимы только значения:
09:00 – 18:00
В 12-часовом формате отображение будет:
9:00 AM – 6:00 PM
По умолчанию используются:
Чтобы добавить секунды:
<TimeField
label="Точное время"
granularity="second"
/>
Пример отображения:
09 : 30 : 45
TimePicker объединяет:
Пример:
import {TimePicker} from 'react-aria-components';
<TimePicker
label="Выберите время"
/>
Формат времени в выпадающем списке зависит от:
React Aria реализует поддержку ARIA Time Field Pattern.
Скринридеры озвучивают сегменты:
Пример:
Hours 9
Minutes 30
AM
Поддерживаются:
Основные клавиши:
| Клавиша | Действие |
|---|---|
| Tab | переход между сегментами |
| ArrowUp | увеличение значения |
| ArrowDown | уменьшение |
| ArrowLeft | предыдущий сегмент |
| ArrowRight | следующий сегмент |
В 12-часовом формате стрелки также переключают AM/PM.
Для получения выбранного времени используется
onChange.
function Example() {
const [time, setTime] = useState(null);
return (
<TimeField
label="Время"
value={time}
onCha nge={setTime}
/>
);
}
Полученное значение:
Time {
hour: 14,
minute: 30
}
Независимо от отображаемого формата.
Для отображения времени вне компонента используется:
useDateFormatter
Пример:
import {useDateFormatter} from 'react-aria';
let formatter = useDateFormatter({
timeStyle: "short"
});
Формат автоматически будет:
9:30 AM09:30в зависимости от локали.
hourCycle позволяет переопределить форматTimeField
├── Label
├── DateInput
│ ├── DateSegment (hour)
│ ├── DateSegment (minute)
│ └── DateSegment (dayPeriod)
└── Validation
Сегмент dayPeriod появляется только при
12-часовом формате.
Некоторые языки используют альтернативные обозначения:
| Язык | AM | PM |
|---|---|---|
| Английский | AM | PM |
| Китайский | 上午 | 下午 |
| Японский | 午前 | 午後 |
React Aria автоматически применяет правильные символы через
Intl.
Неправильно:
"2:30 PM"
Правильно:
Time(14, 30)
React Aria уже выполняет преобразование автоматически.
Ручная логика обычно приводит к ошибкам.
Формат времени должен зависеть от региона пользователя.
Это особенно важно для:
Подходит для:
Примеры:
Подходит для:
Примеры:
18:45
22:10
04:30
Формат исключает неоднозначность AM/PM.
При использовании DatePicker время может отображаться
рядом с датой.
Пример:
20 March 2026, 2:30 PM
или
20.03.2026 14:30
Формат снова определяется локалью.
Основные принципы:
Такая архитектура позволяет строить гибкие интерфейсы времени, которые корректно работают во всех регионах и соответствуют современным требованиям доступности.