# General Translation React SDKs (gt-react, gt-next): RelativeTime URL: https://generaltranslation.com/ru/docs/react/reference/components/relative-time.mdx --- title: RelativeTime description: Форматирование локализованного относительного времени, например «2 часа назад», с помощью General Translation gt-react. Справочник по API RelativeTime. --- Компонент `` отображает локализованное относительное время, например «2 часа назад» или «через 3 дня». Он может либо автоматически выбирать наиболее подходящую единицу времени на основе `Date`, либо работать с явно заданными значением и единицей времени. *Доступно в `gt-react`, `gt-next`, `gt-tanstack-start` и `gt-react-native`. В примерах используется импорт из `gt-react`; вместо этого импортируйте из пакета вашего фреймворка.* ## Обзор [#overview] Передайте объект `Date` в `children`, и `` сам выберет наиболее подходящую единицу времени и отформатирует время относительно `baseDate`. ```tsx {someDate} // Вывод: "2 hours ago" ``` Все форматирование выполняется локально с помощью [`Intl.RelativeTimeFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat). *Примечание: `` может вызывать ошибки гидратации React в приложениях с серверным рендерингом. См. раздел [Как избежать ошибок гидратации](#hydration).* ## Как это работает [#how-it-works] * **Два режима.** Передайте `Date` (через `children` или `date`), и компонент автоматически выберет наиболее подходящую единицу времени относительно `baseDate`, либо явно задайте `value` и `unit` — по аналогии с `Intl.RelativeTimeFormat`. * **Локальное форматирование.** Относительное время вычисляется и форматируется в браузере; значение никогда не отправляется в API General Translation. * **Без входных данных ничего не отображается.** Если не переданы ни дата, ни значение, компонент возвращает `null`. ## Пропсы [#props] | Проп | Описание | Тип | Необязательный | По умолчанию | | ------------------------ | --------------------------------------------------------------------------- | -------------------------------- | -------------- | ------------------------------------ | | [`children`](#children) | `Date`, относительно которого вычисляется относительное время. | `Date` | Да | — | | [`date`](#date) | `Date`, от которого выполняется вычисление. Имеет приоритет над `children`. | `Date` | Да | — | | [`value`](#value) | Явно заданное числовое значение. Требует указания `unit`. | `number` | Да | — | | [`unit`](#unit) | Единица времени, используется вместе с `value`. | `Intl.RelativeTimeFormatUnit` | Да | — | | [`baseDate`](#base-date) | Дата, относительно которой выполняется отсчёт. | `Date` | Да | `new Date()` | | [`options`](#options) | Параметры `Intl.RelativeTimeFormat`. | `Intl.RelativeTimeFormatOptions` | Да | `{ numeric: 'auto', style: 'long' }` | | [`locales`](#locales) | Переопределяет локаль для форматирования. | `string[]` | Да | Активная локаль | | [`name`](#name) | Имя переменной для записи. | `string` | Да | — | ### `children` [#children] **Тип** `Date` · **Необязательно** Объект `Date`. Компонент автоматически выбирает наиболее подходящую единицу времени (от секунд до лет) и форматирует время относительно даты `baseDate`. ### `date` [#date] **Тип** `Date` · **Необязательный** Объект `Date`, от которого вычисляется относительное время. Если указаны и `date`, и `children`, приоритет у `date`. ### `value` [#value] **Тип** `number` · **Необязательно** Явно заданное числовое значение для относительного времени (например, `-1` для «вчера»). Должно использоваться вместе с `unit`. ### `unit` [#unit] **Тип** `Intl.RelativeTimeFormatUnit` · **Необязательно** Единица времени, например `'second'`, `'minute'`, `'hour'`, `'day'`, `'week'`, `'month'` или `'year'`. Обязателен при использовании `value`. ### `baseDate` [#base-date] **Тип** `Date` · **Необязательный** · **По умолчанию** `new Date()` Базовая дата, относительно которой рассчитывается относительное время. По умолчанию используется `new Date()` на момент рендеринга. Задайте её явно, чтобы избежать ошибок гидратации — см. [ниже](#hydration). ### `options` [#options] **Тип** `Intl.RelativeTimeFormatOptions` · **Необязательный** · **По умолчанию** `{ numeric: 'auto', style: 'long' }` Параметры форматирования согласно спецификации [`Intl.RelativeTimeFormatOptions`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat). ### `locales` [#locales] **Тип** `string[]` · **Необязательно** · **По умолчанию** Активная локаль Локали, для которых выполняется форматирование. Если этот параметр опущен, используется активная локаль. См. [аргумент locales](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl#locales_argument). ### `name` [#name] **Тип** `string` · **Необязательно** Необязательное имя записи, используемое в качестве метаданных. ## Примеры [#examples] ```tsx title="PostTimestamp.tsx" import { RelativeTime } from 'gt-react'; export default function PostTimestamp({ post }) { return {post.createdAt}; // [!code highlight] // Вывод: "2 hours ago", "3 days ago", "in 5 minutes" и т.д. } ``` ```tsx title="PostTimestamp.tsx" import { RelativeTime } from 'gt-react'; export default function PostTimestamp({ post }) { return ; // [!code highlight] } ``` ```tsx title="Reminder.tsx" import { RelativeTime } from 'gt-react'; export default function Reminder() { return (

Your trial ends . // [!code highlight]

); // Вывод: "Your trial ends in 3 days." } ``` ```tsx title="Comment.tsx" import { T, RelativeTime } from 'gt-react'; export default function Comment({ comment }) { return ( Posted {comment.createdAt} // [!code highlight] ); } ``` ```tsx title="NumericTimestamp.tsx" import { RelativeTime } from 'gt-react'; export default function NumericTimestamp({ date }) { return ( {date} ); // При numeric: 'always', результат — "1 day ago" вместо "yesterday" } ``` ## Как избежать ошибок гидратации [#hydration] Поскольку `` вычисляет относительное время локально, на сервере и на клиенте он может выдавать разный результат, что приводит к ошибке гидратации. Обычно это происходит, когда: * **`baseDate` по умолчанию равен `new Date()` на момент рендеринга.** Сервер и клиент рендерят страницу с небольшой разницей во времени. Если за это время относительное время переходит через границу единицы времени (например, "59 seconds ago" → "1 minute ago"), результат не совпадёт. * **Локаль по умолчанию различается в разных окружениях**, из-за чего получаются разные строки (например, "hace 2 horas" vs. "2 hours ago"). Явно задайте и локаль, и общий `baseDate`, чтобы сервер и клиент всегда выдавали одну и ту же строку: ```tsx const now = new Date(); // вычисляется один раз, передаётся и серверу, и клиенту {post.createdAt} ```