diff --git a/frontend/app/library/[slug]/read/page.tsx b/frontend/app/library/[slug]/read/page.tsx index f5c266e..13554be 100644 --- a/frontend/app/library/[slug]/read/page.tsx +++ b/frontend/app/library/[slug]/read/page.tsx @@ -16,7 +16,7 @@ import { groupSections, type ChapterNav, } from "@/lib/librarySections"; -import { extractToc, estimateReadingMinutes, markdownHeadingToc, buildTocFromSegments } from "@/lib/toc"; +import { extractToc, estimateReadingMinutes, formatReadingDuration, markdownHeadingToc, buildTocFromSegments } from "@/lib/toc"; import { splitContentSegments } from "@/lib/directiveBlocks"; import { wrapImplicitEntries } from "@/lib/entryBlocks"; import PostToc, { type TocItem } from "@/components/PostToc"; @@ -223,7 +223,7 @@ export default async function LibraryReadPage({ params, searchParams }: PageProp {current.title}

- 第 {nav.index + 1} / {nav.total} 章 · 约 {chapterMinutes} 分钟 + 第 {nav.index + 1} / {nav.total} 章 · 约 {formatReadingDuration(chapterMinutes)} 读完

} @@ -265,7 +265,7 @@ export default async function LibraryReadPage({ params, searchParams }: PageProp

- 第 {nav.index + 1} / {nav.total} 章 · 约 {chapterMinutes} 分钟 + 第 {nav.index + 1} / {nav.total} 章 · 约 {formatReadingDuration(chapterMinutes)} 读完

{post.title}

-

约 {readingMinutes} 分钟读完

+

约 {formatReadingDuration(readingMinutes)} 读完

} left={leftRailNode ? { label: "导航", content: leftRailNode } : undefined} @@ -599,8 +599,8 @@ export default async function PostDetailPage({ params, searchParams }: PageProps {post.comment_count} 评论 ) : null} - - 约 {readingMinutes} 分钟读完 + + 约 {formatReadingDuration(readingMinutes)} 读完

diff --git a/frontend/components/site-doc/SiteDocMasthead.tsx b/frontend/components/site-doc/SiteDocMasthead.tsx index 17fc342..f8ad77e 100644 --- a/frontend/components/site-doc/SiteDocMasthead.tsx +++ b/frontend/components/site-doc/SiteDocMasthead.tsx @@ -1,6 +1,7 @@ import type { ReactNode } from "react"; import { Clock } from "lucide-react"; import { formatDate } from "@/lib/format"; +import { formatReadingDuration } from "@/lib/toc"; function formatDateTime(dateStr: string) { return new Date(dateStr).toLocaleString("zh-CN", { @@ -83,9 +84,9 @@ export default function SiteDocMasthead({ {readingMinutes != null ? ( - 约 {readingMinutes} 分钟读完 + 约 {formatReadingDuration(readingMinutes)} 读完 ) : null} diff --git a/frontend/lib/toc.ts b/frontend/lib/toc.ts index c946d90..a1b507c 100644 --- a/frontend/lib/toc.ts +++ b/frontend/lib/toc.ts @@ -167,3 +167,11 @@ export function estimateReadingMinutes(text: string, fallbackLen = 0): number { const len = text.trim().length > 0 ? text.trim().length : fallbackLen; return Math.max(1, Math.ceil(len / 400)); } + +/** 阅读时长展示:≥60 分钟换算成「X 小时 Y 分钟」,避免大分钟数需口算 */ +export function formatReadingDuration(minutes: number): string { + if (minutes < 60) return `${minutes} 分钟`; + const h = Math.floor(minutes / 60); + const m = minutes % 60; + return m > 0 ? `${h} 小时 ${m} 分钟` : `${h} 小时`; +}