**背景 (Context):**

你是一名资深前端架构师，负责为我们的 Vue 3 + TypeScript + Vuetify 3 项目构建基础工具库。该项目要求极高的代码质量、健壮性、可维护性和开发效率。当前任务是设计并实现一个专业、可靠且覆盖全面的时间处理工具模块。
W
**核心指令 (Core Directive):**

请严格遵循 `vue3-typescript-stye.md` 中定义的所有规范，创建一个位于 `src/utils/time.ts` 的时间工具模块。此模块必须基于业界公认的最佳实践，封装所有与时间相关的操作，确保前端应用在处理时间数据时的一致性、准确性和健朗性。放弃手动计算时间的原始思路，全面拥抱成熟的第三方库来保证专业性。

---

### **技术架构与设计规范 (Technical Architecture & Design Specification)**

**1. 核心依赖 (Core Dependency):**

* **唯一指定库:** 项目中所有的时间/日期操作**必须**使用 `date-fns` 和 `date-fns-tz` 库。严禁手动进行复杂的日期计算（如月份加减、年份推算），以规避闰年、月份天数不均等边界问题。
* **安装命令:** 使用 pnpm 进行安装：`pnpm add date-fns date-fns-tz`。

**2. 模块设计与常量定义 (Module Design & Constants):**

* **文件路径:** `src/utils/time.ts`
* **核心常量:**
    * `API_DATETIME_FORMAT`: 定义一个字符串常量，值为 `"yyyy-MM-dd HH:mm:ss"`，用于统一前后端接口的时间格式。
    * `TIMEZONE`: 定义一个字符串常量，值为 `"Asia/Shanghai"`，代表所有时间转换的目标时区（东八区）。

**3. 函数接口定义 (Function Interface Definitions):**

模块需要导出以下经过精心设计的函数，所有函数必须包含完整的 JSDoc 注释，并拥有精确的 TypeScript 类型签名。

* **`formatDate(date: Date | number, formatStr: string = API_DATETIME_FORMAT): string`**
    * **描述:** 将给定的 `Date` 对象或时间戳（`number`）格式化为指定格式的字符串。
    * **核心逻辑:** 使用 `date-fns-tz` 的 `formatInTimeZone` 函数，确保输出的字符串始终基于我们定义的 `TIMEZONE` (`Asia/Shanghai`)。
    * **参数:**
        * `date`: 必选，要格式化的 `Date` 对象或时间戳。
        * `formatStr`: 可选，目标格式字符串，默认为 `API_DATETIME_FORMAT`。
    * **返回值:** `string` - 格式化后的时间字符串。

* **`parseDate(dateStr: string, formatStr: string = API_DATETIME_FORMAT): Date`**
    * **描述:** 将符合标准格式的时间字符串解析为 `Date` 对象。
    * **核心逻辑:** 使用 `date-fns` 的 `parse` 函数进行解析。必须健壮地处理无效的输入字符串，如果解析失败，应返回一个无效的 `Date` 对象 (可以通过 `isValid` from `date-fns` 进行检查)。
    * **参数:**
        * `dateStr`: 必选，要解析的时间字符串，如 "2025-01-01 08:00:00"。
        * `formatStr`: 可选，源字符串的格式，默认为 `API_DATETIME_FORMAT`。
    * **返回值:** `Date` - 解析后的 `Date` 对象。

* **`getRelativeDate(options: { years?: number; months?: number; days?: number }, fromDate: Date = new Date()): Date`**
    * **描述:** 一个通用的、获取相对日期的核心函数。可根据当前时间或指定时间，推算过去或未来的某个时间点。
    * **核心逻辑:** 组合使用 `date-fns` 的 `add` 或 `sub` 系列函数（如 `subYears`, `subMonths`, `subDays`）来实现。操作必须是不可变的（immutable），即不修改原始 `fromDate` 对象。
    * **参数:**
        * `options`: 必选，一个包含 `years?`, `months?`, `days?` 的对象，值为负数表示过去，正数表示未来。
        * `fromDate`: 可选，计算的基准日期，默认为当前时间 `new Date()`。
    * **返回值:** `Date` - 计算得出的新 `Date` 对象。

* **便捷函数 (Convenience Functions):**
    * **描述:** 基于 `getRelativeDate` 和 `formatDate` 封装一系列便捷函数，以满足业务中的常见需求。这些函数使业务代码更具可读性。
    * **函数列表:**
        * `getMonthAgo(fromDate?: Date): string` - 获取一个月前的时间字符串。
        * `getThreeMonthsAgo(fromDate?: Date): string` - 获取三个月前的时间字符串。
        * `getYearAgo(fromDate?: Date): string` - 获取一年前的时间字符串。
        * `getThreeYearsAgo(fromDate?: Date): string` - 获取三年前的时间字符串。
    * **实现细节:** 每个函数内部调用 `getRelativeDate` 计算出 `Date` 对象，然后调用 `formatDate` 格式化为标准 API 字符串。例如，`getMonthAgo` 内部应调用 `getRelativeDate({ months: -1 }, fromDate)`。

**4. 非功能性需求 (Non-Functional Requirements):**

* **代码健壮性:**
    * 所有函数在接收参数时，应考虑 `null` 或 `undefined` 的可能性，并进行适当的防御性编程。
    * `parseDate` 函数是与外部数据交互的关键入口，其对异常输入的处理能力至关重要。
* **性能:**
    * **必须** 采用 Tree-shaking 友好的方式从 `date-fns` 和 `date-fns-tz` 导入函数，例如：`import { format } from 'date-fns'`，而不是 `import * as dateFns from 'date-fns'`。
* **不可变性 (Immutability):**
    * 所有对 `Date` 对象的操作都不能直接修改原始对象，而应返回一个新的 `Date` 实例。`date-fns` 默认遵循此模式，需确保在实现中维持这一特性。

**5. 最终产出 (Final Output):**

请根据以上所有规范，生成 `src/utils/time.ts` 文件的完整 TypeScript 代码。代码必须是生产级别的，包含完整的 JSDoc 注释、精确的类型定义，并体现出卓越的工程实践。