diff --git a/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.test.jsx b/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.test.jsx
new file mode 100644
index 0000000..28e9ef1
--- /dev/null
+++ b/src/features/room-turnover-reward/components/RoomTurnoverRewardConfigSummary.test.jsx
@@ -0,0 +1,52 @@
+import { render, screen } from "@testing-library/react";
+import userEvent from "@testing-library/user-event";
+import { beforeEach, expect, test } from "vitest";
+import { TimeZoneProvider, useTimeZone } from "@/app/timezone/TimeZoneProvider.jsx";
+import { RoomTurnoverRewardConfigSummary } from "./RoomTurnoverRewardConfigSummary.jsx";
+
+const updatedAtMs = Date.UTC(2026, 5, 7, 5, 4, 13);
+
+beforeEach(() => {
+ window.localStorage.clear();
+});
+
+test("formats summary update time through the selected admin timezone", async () => {
+ const user = userEvent.setup();
+
+ render(
+
+
+
+ );
+
+ expect(screen.queryByText(String(updatedAtMs))).not.toBeInTheDocument();
+ expect(screen.getByText("2026-06-07 13:04:13")).toBeInTheDocument();
+
+ await user.click(screen.getByRole("button", { name: "UTC" }));
+
+ expect(screen.getByText("2026-06-07 05:04:13")).toBeInTheDocument();
+ expect(screen.queryByText(String(updatedAtMs))).not.toBeInTheDocument();
+});
+
+function SummaryFixture() {
+ const { setTimeZone } = useTimeZone();
+
+ return (
+ <>
+
+
{}}
+ onRefresh={() => {}}
+ />
+ >
+ );
+}
diff --git a/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx b/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx
index 5130d2a..63aab7c 100644
--- a/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx
+++ b/src/features/room-turnover-reward/pages/RoomTurnoverRewardPage.jsx
@@ -7,7 +7,7 @@ import { AdminActionIconButton, AdminListBody, AdminListPage } from "@/shared/ui
import { DataState } from "@/shared/ui/DataState.jsx";
import { DataTable } from "@/shared/ui/DataTable.jsx";
import { createOptionsColumnFilter, createTextColumnFilter } from "@/shared/ui/tableFilters.js";
-import { formatMillis } from "@/shared/utils/time.js";
+import { TimeText } from "@/shared/ui/TimeText.jsx";
const settlementStatusOptions = [
["pending", "待发放"],
@@ -33,8 +33,10 @@ const columnsBase = [
width: "minmax(260px, 1.1fr)",
render: (item) => (
- {formatMillis(item.periodStartMs)}
- 至 {formatMillis(item.periodEndMs)}
+
+
+ 至
+
),
},
diff --git a/src/features/rooms/components/RoomDetailDrawer.jsx b/src/features/rooms/components/RoomDetailDrawer.jsx
index dea1c8a..1f23275 100644
--- a/src/features/rooms/components/RoomDetailDrawer.jsx
+++ b/src/features/rooms/components/RoomDetailDrawer.jsx
@@ -3,7 +3,7 @@ import MeetingRoomOutlined from "@mui/icons-material/MeetingRoomOutlined";
import PersonOutlineOutlined from "@mui/icons-material/PersonOutlineOutlined";
import { useEffect, useState } from "react";
import { SideDrawer } from "@/shared/ui/SideDrawer.jsx";
-import { formatMillis } from "@/shared/utils/time.js";
+import { TimeText } from "@/shared/ui/TimeText.jsx";
import { roomStatusLabels } from "@/features/rooms/constants.js";
import styles from "@/features/rooms/rooms.module.css";
@@ -37,8 +37,8 @@ export function RoomDetailDrawer({ onClose, open, room }) {
["房间状态", roomStatusLabels[normalizedStatus]],
["房间模式", room.mode],
["区域", room.regionName],
- ["创建时间", formatMillis(room.createdAtMs)],
- ["更新时间", formatMillis(room.updatedAtMs)]
+ ["创建时间", ],
+ ["更新时间", ]
]}
title="基础信息"
/>
@@ -47,7 +47,7 @@ export function RoomDetailDrawer({ onClose, open, room }) {
],
["关闭原因", room.closeReason]
]}
title="关闭信息"
diff --git a/src/features/rooms/pages/RoomConfigPage.jsx b/src/features/rooms/pages/RoomConfigPage.jsx
index 4d65bf9..88db988 100644
--- a/src/features/rooms/pages/RoomConfigPage.jsx
+++ b/src/features/rooms/pages/RoomConfigPage.jsx
@@ -6,7 +6,7 @@ import MenuItem from "@mui/material/MenuItem";
import TextField from "@mui/material/TextField";
import { DataState } from "@/shared/ui/DataState.jsx";
import { AdminActionIconButton, AdminListBody, AdminListPage, AdminListToolbar } from "@/shared/ui/AdminListLayout.jsx";
-import { formatMillis } from "@/shared/utils/time.js";
+import { TimeText } from "@/shared/ui/TimeText.jsx";
import { useRoomConfigPage } from "@/features/rooms/hooks/useRoomConfigPage.js";
import styles from "@/features/rooms/rooms.module.css";
@@ -45,7 +45,7 @@ export function RoomConfigPage() {
座位数
- {page.form.updatedAtMs ? formatMillis(page.form.updatedAtMs) : "默认配置"}
+ {page.form.updatedAtMs ? : "默认配置"}
diff --git a/src/features/seven-day-checkin/components/SevenDayCheckInConfigSummary.jsx b/src/features/seven-day-checkin/components/SevenDayCheckInConfigSummary.jsx
index b4eb9f6..a5b7e7f 100644
--- a/src/features/seven-day-checkin/components/SevenDayCheckInConfigSummary.jsx
+++ b/src/features/seven-day-checkin/components/SevenDayCheckInConfigSummary.jsx
@@ -2,7 +2,7 @@ import EditOutlined from "@mui/icons-material/EditOutlined";
import RefreshOutlined from "@mui/icons-material/RefreshOutlined";
import { Button } from "@/shared/ui/Button.jsx";
import { AdminActionIconButton } from "@/shared/ui/AdminListLayout.jsx";
-import { formatMillis } from "@/shared/utils/time.js";
+import { TimeText } from "@/shared/ui/TimeText.jsx";
import styles from "@/features/seven-day-checkin/seven-day-checkin.module.css";
export function SevenDayCheckInConfigSummary({ canUpdate, config, configLoading, onEdit, onRefresh, resourceGroups }) {
@@ -16,7 +16,7 @@ export function SevenDayCheckInConfigSummary({ canUpdate, config, configLoading,