time/README.md

2.4 KiB
Raw Permalink Blame History

@go/time

@go/time 是一个致力于“零心智负担”的时间处理库。它通过极简的 API 屏蔽了 Go 原生 time 包中繁琐的 Layout 记忆与类型转换,让时间解析、格式化与加减操作变得直观且高效。

🎯 设计哲学

  • 直观 Layout:不再需要记忆 2006-01-02 15:04:05。使用 YYYY-MM-DD HH:mm:ss 等符合直觉的占位符。
  • 强力解析Parse(v) 几乎能吞下任何你丢给它的时间数据时间戳、ISO、RFC3339、中文、JS Date 字符串等),并自动归一化为本地时间。
  • DSL 时间算术:通过简洁的字符串表达式(如 +1Y-2M)进行复杂的时间偏移计算。
  • 零摩擦防御:即使输入非法格式,也绝不 Panic而是返回合理的默认值time.Now()),确保服务高可用。

🚀 核心特性

1. 强力解析 Parse(v any)

不再需要 layoutParse 会自动探测以下格式并返回 time.Time

支持格式清单:

  • 时间戳: 10位(秒)、13位(毫秒)、16位(微秒)、19位(纳秒) 自动识别。
  • 标准日期: YYYY-MM-DD, YYYY/MM/DD, YYYY.01.02 (支持短年份如 24-01-02)。
  • 标准时间: YYYY-MM-DD HH:mm:ss, YYYY-MM-DDTHH:mm:ss.SSS (支持空格或 T 分隔)。
  • ISO/RFC3339: 2024-01-01T00:00:00Z, 2024-01-01T00:00:00+08:00
  • 紧凑格式: 20240101153045, 20240101
  • 中文格式: 2024年01月01日 15点30分, 下午3点, 15时30分 (缺失部分自动补全)。
  • 常见 Web 格式: JS Date 字符串, HTTP Header (RFC1123)。

时区处理规则:

  • 归一化: 所有带时区信息的输入(如 UTC 或 +08:00在解析后都会自动转换为当前服务器的 time.Local
  • 无时区输入: 默认视为 time.Local

2. 语义化格式化 Format(layout, v)

支持直观占位符:YYYY, MM, DD, HH, mm, ss, ms, ZZ (时区偏移)。

3. 时间加减 DSL Add(expr, v)

  • 单位: Y(年), M(月), D(天), h, m, s, ms, us, ns
  • 示例: +1Y-2M (加一年减两个月), -1D (昨天), +1h30m (90分钟后)。

📦 安装

go get apigo.cc/go/time

💡 快速开始

import "apigo.cc/go/time"

// 自动探测并转为本地时间
tm := time.Parse("2025-06-23T15:30:45Z") 

// 直观格式化
fmt.Println(time.Format("YYYY-MM-DD HH:mm", tm))

// 语义加减
nextMonth := time.Add("+1M", tm)