diff --git a/CHANGELOG.md b/CHANGELOG.md index 2331281..68a62aa 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -5,7 +5,6 @@ - **强大的时间解析引擎**: 移植 `time` 模块的核心算法至 `cast.ParseTime`,支持时间戳(秒至纳秒)、RFC3339、JS 格式、紧凑格式(20060102150405)及中文日期解析。 - **时间操作 API**: 新增 `FormatTime(layout, v)` 支持直观格式化(YYYY-MM-DD),新增 `AddTime(expr, v)` 支持 DSL 时间加减(+1Y-2M)。 - **时区上下文支持**: 引入 `TimeZone` 类型及全局 `DefaultTimeZone`,支持 `SetDefaultTimeZone` 统一控制全项目的转换时区。 -- **TimeZone.Now()**: 新增时区感知的 `Now()` 方法。 ### Optimized - **ToTime 升级**: 重构 `ToTime` 底层,默认调用高性能 `ParseTime` 引擎,并强制转换至 `DefaultTimeZone` 时区。 diff --git a/README.md b/README.md index 9aed867..11d62f1 100644 --- a/README.md +++ b/README.md @@ -7,9 +7,9 @@ `@go/cast` 是一个为“极致敏捷”设计的 Go 基础工具库。其核心目标是**彻底消除摩擦**: -* **万能零摩擦入口**:`To[T]` 作为核心 API,永不返回 `error`。在失败或非法转换时静默返回类型零值。 +* **万能零摩擦入口**:`To[T]、Convert` 作为核心 API,永不返回 `error`。在失败或非法转换时静默返回类型零值。 * **语义化 As 包装**:提供 `As` 函数用于将传统“值+错误”双返回结果一键转化为单值,消除外部库带来的摩擦。 -* **智能自动穿透**:`To[T]` 自动识别 JSON 文本、复杂容器映射、指针穿透等场景。 +* **智能自动穿透**:`To[T]、Convert` 自动识别 JSON 文本、复杂容器映射、指针穿透等场景。 * **极致性能 JSON**:内置高性能 `fastjson` 引擎,支持 Struct 元数据缓存、`time.Time` 原生处理、零分配 Key 匹配及批量转义优化。 ## 📦 安装 @@ -86,7 +86,8 @@ list, _ := cast.ToSlice[int]([]string{"1", "2", "3"}) 7. **时区支持** * `DefaultTimeZone` —— 全局默认时区上下文。 * `SetDefaultTimeZone(*time.Location)` —— 修改全局默认时区(影响所有 Convert 与 ToTime 操作)。 - * `TimeZone.Now()` —— 获取时区上下文下的当前时间。 + * `DefaultTimeZone.Now()` —— 获取时区上下文下的当前时间。 + * `NewTimeZone(*time.Location)` —— 创建一个时区上下文,支持 Parse、Format、Add、Now 等操作。 ## 🧪 验证状态 测试全部通过,性能达标。 diff --git a/time.go b/time.go index 4d8ba71..962b920 100644 --- a/time.go +++ b/time.go @@ -354,3 +354,38 @@ func AddTime(expr string, v any) time.Time { // Now 获取当前时间 func (tz *TimeZone) Now() time.Time { return time.Now().In(tz.loc) } + +// Location 获取当前时区 +func (tz *TimeZone) Location() *time.Location { return tz.loc } + +// Now 获取当前时间 +func Now() time.Time { return DefaultTimeZone.Now() } + +// DescribeDuration 将时长转化为自然语言描述,例如 "1h 1m 1s" +func (tz *TimeZone) DescribeDuration(d time.Duration) string { + h := d / time.Hour + d -= h * time.Hour + m := d / time.Minute + d -= m * time.Minute + s := d / time.Second + + var parts []string + if h > 0 { + parts = append(parts, fmt.Sprintf("%dh", h)) + } + if m > 0 { + parts = append(parts, fmt.Sprintf("%dm", m)) + } + if s > 0 { + parts = append(parts, fmt.Sprintf("%ds", s)) + } + if len(parts) == 0 { + return "0s" + } + return strings.Join(parts, " ") +} + +// DescribeDuration 将时长转化为自然语言描述 +func DescribeDuration(d time.Duration) string { + return DefaultTimeZone.DescribeDuration(d) +}