# General Translation React SDKs (gt-react, gt-next): RelativeTime URL: https://generaltranslation.com/zh/docs/react/reference/components/relative-time.mdx --- title: RelativeTime description: 使用 General Translation gt-react 格式化本地化的相对时间,例如“2 小时前”。RelativeTime 的 API 参考。 --- `` 组件用于渲染本地化的相对时间,例如“2 小时前”或“3 天后”。它既可以根据 `Date` 自动选择最合适的时间单位,也可以根据显式指定的值和时间单位进行渲染。 *可用于 `gt-react`、`gt-next`、`gt-tanstack-start` 和 `gt-react-native`。示例从 `gt-react` 导入;请改为从你所用框架对应的包中导入。* ## 概览 [#overview] 将 `Date` 作为子元素传入后,`` 会自动选择最合适的时间单位,并基于 `baseDate` 格式化相对时间。 ```tsx {someDate} // 输出:"2 hours ago" ``` 所有格式化都在本地通过 [`Intl.RelativeTimeFormat`](https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/Intl/RelativeTimeFormat) 完成。 *注意:在服务器端渲染的应用中,`` 可能会引发 React 的 hydration 错误。请参阅[避免 hydration 错误](#hydration)。* ## 工作方式 [#how-it-works] * **两种模式。** 你可以提供 `Date` (通过 `children` 或 `date`) ,组件会根据 `baseDate` 自动选择最合适的时间单位;也可以显式提供 `value` 和 `unit`,其行为与 `Intl.RelativeTimeFormat` 保持一致。 * **本地格式化。** 相对时间会在浏览器中计算并格式化;该值绝不会发送到 General Translation API。 * **无输入时不渲染任何内容。** 如果既未提供日期也未提供值,组件会渲染 `null`。 ## 属性 [#props] | Prop | 描述 | Type | 可选 | 默认值 | | ------------------------ | ------------------------------- | -------------------------------- | -- | ------------------------------------ | | [`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 错误——参见[下文](#hydration)。 ### `options` [#options] **Type** `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 错误 [#hydration] 由于 `` 会在本地计算相对时间,因此服务器端和客户端可能会产生不同的输出,从而导致 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} ```