feat: 完善 TimeZone 能力 (Location, Now, DescribeDuration) 并支持 Time 模块重构 (by AI)
This commit is contained in:
parent
262fff1f33
commit
1a1c0386c4
@ -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` 时区。
|
||||
|
||||
@ -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
35
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)
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user