feat: 完善 TimeZone 能力 (Location, Now, DescribeDuration) 并支持 Time 模块重构 (by AI)

This commit is contained in:
AI Engineer 2026-05-04 14:57:53 +08:00
parent 262fff1f33
commit 1a1c0386c4
3 changed files with 39 additions and 4 deletions

View File

@ -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` 时区。

View File

@ -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 等操作。
## 🧪 验证状态
测试全部通过,性能达标。

35
time.go
View File

@ -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)
}