V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
The Go Programming Language
http://golang.org/
Go Playground
Go Projects
Revel Web Framework
iseki
V2EX  ›  Go 编程语言

看 Go 的时间库不顺眼很久了,所以从别的语言里抄了一个

  •  
  •   iseki ·
    iseki0 · 9 天前 · 3730 次点击

    主要的内容是将 time.Time 按照不同的使用场景细分为 LocalDate LocalTime LocalDateTime OffsetDateTime 以及将来会有的 ZonedDateTime 等,将类型安全进行到底 xD 。

    设计上尽量仿照 JSR-310 ,毕竟这个切分类型的思想也源自 JSR-310 。参考:threeten.org

    对于某些可做出不同决策且个人不认为有明确优劣之分的设计,原则上遵守 JSR-310 习惯。

    此外:

    • 大部分代码使用 AI 完成,但都经过人工评审,可以放心使用。
    • 该项目主要是参考既有成熟设计( JSR-310 ),涉及复杂算法的部分已经经过仔细的人工评审。
    • 当前剩余和时区有关的部分尚未完善,因为 Go 没有很好地暴露 time.Location 抽象,自行携带时区数据库基础设施显得过于笨重,目前还在考虑具体解决方案。此外因为大部分对标 ZonedDateTime 的操作均可通过 Go 标准库的 time.Time 完成,所以这个部分可能优先级不高。
    • 由于 Go 语言本身与 Java 语言差异巨大,API 设计不可能照搬,已针对空值等不可避免的问题进行针对性处理,但目前仍然不排除后续调整部分具体 API 设计的情况,比如调整参数个数等。空值处理等核心设计不太可能变化。
    • 核心类型已全部支持 Go 1.24 json 库支持的 IsZero() 判定,可放心使用 omitzero 标记。

    目前主要功能部分还剩下 Period Duration 以及时区相关等尚未完成,后续会尽量补全。

    项目地址: https://github.com/iseki0/goda

    40 条回复    2025-11-20 01:16:47 +08:00
    yb2313
        1
    yb2313  
       8 天前
    别从 js 里抄就好
    jjx
        2
    jjx  
       8 天前   ❤️ 2
    大部分代码使用 AI 完成

    以后还是要小心点了 个人看法
    Baymaxbowen
        3
    Baymaxbowen  
       8 天前   ❤️ 17
    @yb2313 关于为啥不要在 js 抄
    https://jsdate.wtf/
    akiyamamio
        4
    akiyamamio  
       8 天前
    gtime 就挺好用的了
    sunmoon1983
        5
    sunmoon1983  
       8 天前
    感觉 carbon 和 gtime 都可以呀
    apkapb
        6
    apkapb  
       8 天前
    我怎么觉得做为自带的标准库已经够好用了,什么 Time{},Date(),以及 Duration ,完全够用了。

    反倒是 Java 里面的,特别是结合 Android ,写得我难受死了
    zoharSoul
        7
    zoharSoul  
       8 天前
    很棒, 是不是支持 yyyy-MM-dd 这种表示法?
    Ketteiron
        8
    Ketteiron  
       8 天前
    go 的时间库确实没有大而全的,一旦需要用到只能东拼西凑
    如果只需要 Local ,我会用
    https://github.com/googleapis/google-cloud-go/blob/main/civil/civil.go
    但也就只有 Local
    iseki
        9
    iseki  
    OP
       8 天前 via Android
    @Baymaxbowen js 有了,js-joda
    iseki
        10
    iseki  
    OP
       8 天前 via Android
    @Ketteiron civil 只提供了 LocalDate
    iseki
        11
    iseki  
    OP
       8 天前 via Android
    @zoharSoul 暂时不提供自定义格式化功能,只提供标准格式,这个包主要用于运算和类型安全。考虑到 Go 的使用场景,在经典后端下,使用自定义格式化功能的地方,不多。
    iseki
        12
    iseki  
    OP
       8 天前 via Android
    @sunmoon1983 和 carbon gtime 设计思路不同,他们都没有采用 310 建模。这两个库和 time.Time 在类型上没有区别。
    iseki
        13
    iseki  
    OP
       8 天前 via Android
    @apkapb 那可能你不需要更严格的类型吧,JSR-310 把 r 日期时间划分了近 10 种类型,以应对不同场景。
    oom
        14
    oom  
       8 天前
    6 ,star 了
    cooooing
        15
    cooooing  
       8 天前
    @Baymaxbowen 生草,一个没答对
    wangtian2020
        16
    wangtian2020  
       8 天前
    看到前几个 go 帖子我就想说了,go 连 dayjs 抄都抄不像,js 几 kb 就能实现的事儿
    encounter2017
        17
    encounter2017  
       8 天前
    不支持 format 好,要不然又会有 2006-01-02 15:04:05 手动狗头
    iseki
        18
    iseki  
    OP
       8 天前 via Android
    @encounter2017 当然考虑到 JSR-310 包含这个功能,也许以后会支持上。
    Ketteiron
        19
    Ketteiron  
       8 天前
    @iseki #10 Date/Time/DateTime 都有。
    只是性能不太行,功能也少。
    iseki
        20
    iseki  
    OP
       8 天前
    @Ketteiron 确实,我没看见另外两个类型,疏忽了。总之我还是照着 JSR-310 抄吧。
    z1154505909
        21
    z1154505909  
       8 天前
    @Baymaxbowen 做了一遍,我后端崽认输。都他妈是什么玩意
    roundgis
        22
    roundgis  
       8 天前 via Android
    @Baymaxbowen 这个可以作为面试题
    Baymaxbowen
        23
    Baymaxbowen  
       8 天前 via iPhone
    @roundgis 那我要干翻面试官
    iseki
        24
    iseki  
    OP
       8 天前 via Android
    提醒一下本 lib 是按照 Java 的语言提案 310 号编写的,该提案对应的功能已经在 Java8 时进入
    Java 标准库 java.time 。
    和 JavaScript 没有任何关系。
    NewYear
        25
    NewYear  
       8 天前
    我们可以在 2026 年 0 月 1 日相聚……
    iseki
        26
    iseki  
    OP
       8 天前
    @NewYear 别吓我,我看一眼去
    iseki
        27
    iseki  
    OP
       8 天前
    @NewYear 我这有 guard ,这个事我还特别关注过啊
    if month < January || month > December {
    e = newError("month %d out of range", month)
    RedisMasterNode
        28
    RedisMasterNode  
       8 天前
    说实话为什么要把 Java 那套带进来呢...= =不反对(毕竟辛苦开发的)但是不看好会有很多受众。

    前面的人也回复过了 Go 里面已经有不少好用的开源时间/日期 Package ,https://github.com/dromara/carbon 就挺好用的。

    不太看好这个能有人喜欢用。
    iseki
        29
    iseki  
    OP
       8 天前
    @RedisMasterNode 看了下 carbon ,确实很完善,但是缺了一些点刚好 JSR-310 的东西可以补上,所以就弄了。
    zhady009
        30
    zhady009  
       7 天前
    @RedisMasterNode 抄 jdk 没毛病好用的时间库,关注时区、关注时差、UTC 和本地时间每种场景都有
    RedisMasterNode
        31
    RedisMasterNode  
       7 天前
    @zhady009 这些难道不是都有吗...这不是最基础的吗
    iseki
        32
    iseki  
    OP
       7 天前
    @RedisMasterNode 标准库没有,civil 有但是不全,不过勉强能用。carbon 看上去有,但实际上不一样的。
    RedisMasterNode
        33
    RedisMasterNode  
       7 天前
    @iseki 我会建议向高 star 仓库开 pr 而没有必要重新造一个全新的轮子
    iseki
        34
    iseki  
    OP
       7 天前
    @RedisMasterNode civil 这个可以考虑,但是和 carbon 那种思路并不相同。所以选择干脆按照 JSR-310 开新的项目,一些取舍也不必纠结,比如隔壁贴讨论的 MinusMonth 语义什么的。
    zhady009
        35
    zhady009  
       6 天前   ❤️ 1
    @RedisMasterNode 其实差挺多的,Go 标准库里的表达歧义 JDK 在类型上就给你表达清楚了,历法也没有 JDK 的好使。主要问题还是 API 表达能力差会有歧义,你说能用就行那就这样吧
    iseki
        36
    iseki  
    OP
       6 天前 via Android
    另外就是 Go 标准库有个很扭曲的设计,我倾向于是设计者忘了这件事。Weekday 中 0=Sunday ,而 Month 则是 0=无效值
    lysShub
        37
    lysShub  
       4 天前
    @iseki 都定义枚举了,管他具体值是什么
    iseki
        38
    iseki  
    OP
       4 天前 via Android
    @lysShub 因为 Go 必须考虑零值。因为 Go 的 struct 默认填充 0 。
    Nzelites
        39
    Nzelites  
       1 天前
    @Baymaxbowen 给我逗乐了
    iseki
        40
    iseki  
    OP
       1 天前 via Android
    目前 Temporal LocalDate LocalTime LocalDateTime 已完成,数据库支持已测试 PostgreSQL/MySQL 。
    下一步将补充 ZonedDateTime 和 Duration 。
    关于   ·   帮助文档   ·   自助推广系统   ·   博客   ·   API   ·   FAQ   ·   Solana   ·   1075 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 24ms · UTC 23:15 · PVG 07:15 · LAX 15:15 · JFK 18:15
    ♥ Do have faith in what you're doing.