更新日志
v2.7.0 (2026-10-19)
✨ 新功能
- 新增
AddWeekdays、AddWeekday、SubWeekdays、SubWeekday方法,支持跳过周末日进行工作日计算:按实例配置的周末日跳过非工作日进行日期推移,方便按工作日计算截止日期;四个方法命名与AddDays/AddDay/SubDays/SubDay保持一致,周末日从实例读取因此SetWeekendDays仍生效;当七天全部被标记为周末日时,每个工作日跨度被限制为整周以防止死循环(by @darakanoit in #366) - 新增
IsSameWeek方法,判断两个日期是否在同一周:补全IsSame*家族(IsSameCentury、IsSameDecade、IsSameYear、IsSameQuarter、IsSameWeek、IsSameMonth、IsSameDay、IsSameHour、IsSameMinute、IsSameSecond);尊重SetWeekStartsAt设置,因此同一组日期在不同设置下可能不属于同一周;比较基于周起始日期,正确处理跨年份的边界周(by @darakanoit in #368) - 新增
IsBirthday方法,比较月日判断是否生日:判断两个日期是否落在同一月同日,忽略年份;无参数时与当前时间比较;2月29日仅匹配2月29日,平年永远不会是生日,与 PHP Carbon 行为一致(by @darakanoit in #364) - 新增
Asia/Jakarta时区常量支持(by @mirzaq19 in #374)
🐛 修复
- 修复夏令时回退期间
StartOfSecond和EndOfSecond方法选择错误时间出现的问题:在重复的夏令时小时内,time.Date重建可能选择同一本地时间的另一次出现;现在改为复制实例并调整现有时间戳的亚秒精度,保留选中的时刻、位置和配置(by @mikamikasuki in #377) - 修复夏令时回退期间
StartOfMinute和EndOfMinute方法选择错误时间出现的问题:与 #377 同一类 bug,只是上升了一级;现在复制实例并减去本地秒数,保留时刻、位置和偏移(by @dualfroz in #378) - 修复夏令时回退期间
StartOfHour和EndOfHour方法选择错误时间出现的问题:当重建的小时边界存在与接收器偏移一致的有效对应出现时,保留接收器的出现;不存在对应出现时(如 Lord Howe 的部分小时间隔回退)保持现有日历重建行为(by @dajiaohuang in #382) - 修复
DiffInSeconds方法忽略亚秒部分导致跨秒边界计时不准确的问题:减去整秒时间戳时忽略了小数部分,导致跨越秒边界的 0.2 秒间隙被计为整秒;现在当纳秒差符号相反时调整 ±1,按已流逝的整秒计数并朝零截断(by @youdie006 in #379) - 修复
DiffInDays和DiffInWeeks方法跨越夏令时转换时计算错误的问题:除以流逝秒数在跨越夏令时转换时给出错误结果;现在改为按日历日计数(与DiffInMonths按月计数方式一致,AddDate加调整),DiffInWeeks基于它计算;仅跨越夏令时转换的区间结果会变化(by @youdie006 in #376) - 修复
DiffInYears和DiffInMonths方法在不同时区之间比较时估算错误的问题:从各自日期的Year()/Month()字段进行首次估算时,两个日期处于不同位置可能导致偏差;现在先以较早日期所在位置读取较晚日期,再取年月字段,与DiffInDays使用的框架一致(by @ybai08 in #384) - 修复
IsSameDecade方法未比较世纪导致跨世纪日期误判的问题:Decade()是世纪内的十年,因此Parse("1995-08-05").IsSameDecade(Parse("2095-08-05"))曾返回 true;现在也比较Century(),与StartOfDecade使用的分桶一致(by @youdie006 in #375) - 修复
FromStdTime方法在凌晨时刻因 UTC 偏移差异返回错误农历日期的问题:以时间所在时区计算从 1900-01-31 起流逝的时间,两个时刻的偏移会泄漏到日计数中;现在改为在 UTC 中计算挂钟日期之间的天数,与persian.FromStdTime和hebrew.FromStdTime一致(by @youdie006 in #380) - 修复冻结时钟模式下并发调用
Sleep方法导致时钟推进丢失的竞态问题:冻结时钟上的并发Sleep调用彼此以及与Now发生竞态,导致时钟推进丢失;现在使用现有的冻结时钟互斥锁包裹检查和更新(by @yuefdev in #383)
🔧 依赖升级
- 将
github/codeql-action从v4.38.1升级到v4.38.3(by @dependabot[bot] in #372 #381)
v2.6.18 (2026-09-28)
✨ 新功能
- 新增对
哈萨克语的本地化语言支持(lang/kk.json):月份名称、短月份名称、星期名称和短星期名称取自 PHP Carbon 的哈萨克语本地化文件(遵循 CLDR);相对时间短语遵循哈萨克语语法,名词在数字后不变格;季节和星座使用传统哈萨克名称直译(by @darakanoit in #355)
🐛 修复
- 修复
Format方法处理末尾转义字符时可能发生越界访问的 bug:在helper.go的format2layout方法中为转义字符处理添加边界检查,防止越界访问导致的panic(by @gouguoyin in #348) - 修复设置非周一为一周开始日期时,
ToWeekString、ToShortWeekString和Format方法返回星期名称错误的 bug:ToWeekString/ToShortWeekString曾通过DayOfWeek() % DaysPerWeek索引名称资源,但资源按绝对顺序(周日优先)排列;现在改用int(StdTime().Weekday())按绝对星期索引,与Format("l")行为一致(by @sneha4175 in #371) - 修复向已有时间值的数据库字段扫描
NULL时未清空原值的 bug:向已包含时间值的 Carbon 扫描 SQLNULL时返回成功但保留原日期;现在在Carbon.Scan及布局、格式和时间戳扫描器包装器中重置目标值(by @vitalivo in #360)
⚡ 性能优化
- 优化语言实例和语言资源的缓存与共享机制,通过写时复制减少内存分配:
SetLocale此前将完整的缓存语言映射复制到每个Language实例,导致每个 Carbon 实例分配全新的 20 项映射;现在SetLocale共享缓存映射并标记为共享,SetResources在首次写入前复制,只读资源的方法继续使用共享映射;每个NewCarbon()的分配从 1600 B / 13 次降至 232 B / 4 次(by @darakanoit in #350) - 优化月份、星期、季节和星座本地化资源查询,避免每次调用分割字符串:六个方法每次调用都读取 "|" 分隔的语言资源并使用
strings.Split分割,仅为了索引一个元素;现在使用小型辅助函数通过strings.Count和strings.IndexByte原地定位元素,每次调用零分配;Constellation-61.54%,ToShortWeekString-47.35%,ToWeekString-44.13%,Season-40.65%,ToMonthString-37.66%,ToShortMonthString-35.88%(by @darakanoit in #352) - 每个 locale 共享一个语言实例:
NewCarbon()此前为每个实例构建全新的Language;现在defaultLanguage(locale)在sync.Map中缓存每个 locale 一个即用型Language;构造 Carbon 的分配从 4 次降至 1 次(by @darakanoit in #354) - 优化农历日期转换,预计算年度天数和累计天数表:农历转换此前遍历年份表而非索引,时间复杂度为 O(1900年以来的年数);现在在每个支持的年份和累计总数在包初始化时推导一次;2020 日期转农历 1009 ns -> 282 ns(-72%),转回公历 738 ns -> 23 ns(-97%)(by @darakanoit in #357)
🔧 依赖升级
- 将
github.com/stretchr/testify从v1.11.1升级到v1.12.1(by @dependabot[bot] in #341 #344) - 将
github/codeql-action从v4.37.4升级到v4.38.1(by @dependabot[bot] in #340 #342 #345 #346 #362 #369)
🚀 CI
- 完善
CI测试流程,在PR上运行完整测试和竞态检测,并仅在push时生成和上传覆盖率:测试命令现在通过./...覆盖所有包,而非仅根包;覆盖率文件生成和 Codecov 上传限制为push事件;新增使用-race的全包竞态检测步骤(by @gouguoyin in #361)
v2.6.17 (2026-08-09)
🐛 修复
- 修正
伊斯兰星期名称拼写错误,将Jumaat修改为Jumat - 修复
公历与希伯来历之间的换算计算异常问题
🔧 依赖升级
- 将
github/codeql-action从v4升级至v4.37.4 - 将
actions/setup-go从v6升级至v7 - 将
actions/checkout从v6升级至v7 - 将
codecov/codecov-action从v5升级至v6 - 将
codecov/codecov-action从v6升级至v7
📝 文档
- 将
README文档统一替换为NRG标准化模板 - 清理
README内冗余广告外链,移除已废弃的Go Report Card状态徽章
v2.6.16 (2026-01-28)
🐛 修复
- 修复
Format方法中u、v、x符号解析错误的 bug
🔧 依赖升级
- 将
actions/checkout从v5升级到v6
v2.6.15 (2025-11-15)
✨ 新功能
- 增加
HttpLayout,HttpFormat常量以及ToHttpString方法 - 增加对
蒙古语的本地化语言支持(lang/mn.json) - 增加对
南非语的本地化语言支持(lang/af.json)
🐛 修复
- 移除
difference.go文件的DiffAbsInDuration方法里使用的从go1.19才有的Abs方法 - 修复
荷兰语本地化语言文件(lang/nl.json)里weeks字段里重复的Zondag错误
v2.6.14 (2025-10-28)
✨ 新功能
- 增加对
希腊语的本地化语言支持(lang/el.json) - 增加对
芬兰语的本地化语言支持(lang/fi.json) - 增加对
缅甸语的本地化语言支持(lang/my.json)
🐛 修复
- 优化
traveler.go文件里时间增减系列方法通过复制实例来保证不可变性,以避免修改原始实例
v2.6.13 (2025-10-15)
🐛 修复
- 在
helper.go的format2layout方法中为转义字符处理添加边界检查,防止越界访问导致的panic
⚡ 性能优化
- 在
language.go的SetLocale方法中使用sync.Once确保语言文件只加载一次,使用sync.Map进行线程安全的缓存
v2.6.12 (2025-09-16)
🐛 修复
- 在
type_carbon.go文件UnmarshalJSON方法中设置isEmpty标志以表示空值 - 修复潜在的竞态条件和空指针解引用问题,提高并发安全性
⚡ 性能优化
- 使用
sync.Map实现高性能并发缓存
🔧 依赖升级
- 将
golang环境依赖从1.21降低到1.18 - 将
testify测试框架从v1.10.0升级到v1.11.1
v2.6.11 (2025-07-18)
✨ 新功能
- 新增
希伯来历支持并添加单元测试和基准测试文件
♻️ 重构与变更
- 将
Sleep由结构体方法更改成全局方法 - 重构
波斯历并添加基准测试文件 - 重构
中国农历并添加基准测试文件 - 重构
儒略日/简化儒略日并添加基准测试文件
📝 文档
- 新增整体性能测试报告文件
v2.6.10 (2025-07-07)
✨ 新功能
- 新增
Sleep方法及相关单元测试、基准测试和示例文件 - 新增数字常量,如
MaxYear,MinYear,MaxMonth,MinMonth,MaxDay,MinDay等,并使用这些常量替换硬编码
⚡ 性能优化
- 优化
helper.go里getAbsValue方法,用位操作替换条件判断 - 优化
frozen.go文件里时间冻结相关方法,用原子操作减少锁竞争,优化内存分配 - 优化基准测试文件,覆盖
串行测试、并行测试和并发测试
♻️ 重构与变更
- 将
日语翻译文件从jp.json改成ja.json,说明文档从README.jp.md更名为README.ja.md,以符合 ISO639-1 标准 - 移除已弃用的
ParseWithLayouts方法,用ParseByLayouts方法替代 - 移除已弃用的
ParseWithFormats方法,用ParseByFormats方法替代 - 移除已弃用的
CleanTestNow方法,用ClearTestNow方法替代 - 移除
ParseByLayout和ParseByFormat方法对时间戳字符串的解析支持,解析时间戳请使用CreateFromTimestamp,CreateFromTimestampMilli,CreateFromTimestampMicro,CreateFromTimestampNano方法
📝 文档
- 新增韩语文档
README.ko.md
v2.6.9 (2025-06-28)
♻️ 重构与变更
- 移除对
gorm的GormDataType接口的实现
v2.6.8 (2025-06-12)
🐛 修复
- 解析时如果布局模板或格式模板为空时,返回错误
♻️ 重构与变更
- 在
type_builtin.go中将DateTimeType重命名为dateTimeType,将DateTimeXXXType重命名为dateTimeXXXType - 在
type_builtin.go中将DateType重命名为dateType,将DateXXXType重命名为dateXXXType - 在
type_builtin.go中将TimeType重命名为timeType,将TimeXXXType重命名为timeXXXType
🔧 依赖升级
- 在
tests中将gorm.io/gorm从1.21.1升级到1.30.0 - 在
tests中将gorm.io/driver/mysql从1.5.7升级到1.6.0 - 在
tests中将gorm.io/driver/postgres从1.5.7升级到1.6.0 - 在
tests中将gorm.io/driver/sqlite从1.5.7升级到1.6.0
📝 文档
- 简化 READEME 文件,将详细使用说明和示例用法迁移到 官方网站
- 添加 HelloGitHub 徽章链接
v2.6.7 (2025-05-26)
✨ 新功能
- 将
Closest/Farthest方法第 2 个参数改成可选参数 - 新增
ZeroValue/EpochValue方法 - 新增
DataTyper接口和DataType方法并让内置类型实现DataTyper接口
♻️ 重构与变更
String方法去掉对空值的检查- 将
type_interface.go更名为interfaces.go
v2.6.6 (2025-05-19)
✨ 新功能
- 新增对
xorm的curd集成测试,目前已覆盖MySQL/Postgres/SQLite
🐛 修复
- 修复在
window平台无法找到语言文件的 bug - 修复在创建新的
Carbon实例时丢失layout、weekStartsAt、weekendDays和lang值的错误 - 修复
StartOfWeek和EndOfWeek方法意外更改原始Carbon实例的错误
🚀 CI
- 在
ci中新增window系统的单元测试
v2.6.5 (2025-05-14)
✨ 新功能
Carbon结构体的SetLanguage方法增加对非法Language结构体的判断Carbon结构体的Parse方法增加对Postgres/SQLite时间格式字符串的解析支持Carbon结构体的Parse/ParseByLayout/ParseByFormat方法解析空字符串时返回值从nil更改成空carbonCarbon结构体新增IsEmpty方法用于判断是否为空carbonCarbon结构体新增ClearTestNow方法替代CleanTestNow,CleanTestNow方法未来将移除Carbon结构体新增ParseByLayouts方法替代ParseWithLayouts,ParseWithLayouts方法未来将移除Carbon结构体新增ParseByFormats方法替代ParseWithLayouts,ParseWithFormats方法未来将移除Language结构体的SetResources方法增加对非法资源的判断- 新增对
gorm的curd集成测试,目前已覆盖MySQL/Postgres/SQLite
♻️ 重构与变更
Carbon结构体移除GormDataType方法, 并将Value/MarshalJSON方法从指针接收者改成值接收者LayoutType[T]结构体移除GormDataType方法, 并将Value/MarshalJSON方法从指针接收者改成值接收者FormatType[T]结构体移除GormDataType方法, 并将Value/MarshalJSON方法从指针接收者改成值接收者TimestampType[T]结构体移除GormDataType方法, 并将Value/MarshalJSON方法从指针接收者改成值接收者- 使用
github.com/stretchr/testify/assert替换github.com/stretchr/testify/suite进行单元测试
🔧 依赖升级
- 将
Go最低版本要求从1.18提升到1.21
v2.6.4 (2025-04-28)
✨ 新功能
Language结构体新增Copy方法- 新增
carbon.Timestamp类型别名和carbon.NewTimestamp方法 - 新增
carbon.TimestampMilli类型别名和carbon.NewTimestampMilli方法 - 新增
carbon.TimestampMicro类型别名和carbon.NewTimestampMicro方法 - 新增
carbon.TimestampNano类型别名和carbon.NewTimestampNano方法 - 新增
carbon.DateTime类型别名和carbon.NewDateTime方法 - 新增
carbon.DateTimeMicro类型别名和carbon.NewDateTimeMicro方法 - 新增
carbon.DateTimeMilli类型别名和carbon.NewDateTimeMilli方法 - 新增
carbon.DateTimeNano类型别名和carbon.NewDateTimeNano方法 - 新增
carbon.Date类型别名和carbon.NewDate方法 - 新增
carbon.DateMilli类型别名和carbon.NewDateMilli方法 - 新增
carbon.DateMicro类型别名和carbon.NewDateMicro方法 - 新增
carbon.DateNano类型别名和carbon.NewDateNano方法 - 新增
carbon.Time类型别名和carbon.NewTime方法 - 新增
carbon.TimeMilli类型别名和carbon.NewTimeMilli方法 - 新增
carbon.TimeMicro类型别名和carbon.NewTimeMicro方法 - 新增
carbon.TimeNano类型别名和carbon.NewTimeNano方法
🐛 修复
- 修复数据库字段类型为
nil时抛出异常的bug
⚡ 性能优化
- 性能测试文件增加
b.ResetTimer()
♻️ 重构与变更
- 将
database_types.go拆分成type_carbon.go,type_layout.go,type_format.go,type_timestamp.go - 将
LayoutFactory接口重命名为LayoutTyper和SetLayout方法重命名为Layout - 将
FormatFactory接口重命名为FormatTyper和SetFormat方法重命名为Format - 将
TimestampFactory接口重命名为TimestampTyper和SetPrecision方法重命名为Precision
v2.6.3 (2025-04-21)
✨ 新功能
- 新增
IsEpoch方法用于判断是否是 UNIX 纪元时间(1970-01-01 00:00:00 +0000 UTC) - 新增
WeekEndsAt方法用于获取一周的结束日期 - 新增
SetWeekendDays方法用于设置一周周末日期 - 新增
DefaultWeekStartsAt全局变量用于存储默认一周休息日
🐛 修复
- 修复
IsWeekend,IsWeekday方法不同国家返回结果一致的 bug - 修复
StdTime方法空指针引起的异常 #294
⚡ 性能优化
- 新增性能测试文件
xxx_bench_test.go
♻️ 重构与变更
- 将错误方法由
私有方法改成公开方法 - 将一周默认开始日期从
周日改成周一 - 将
MinValue方法的年份从-9998更改为1 - 将
weeksPerLongYear常量更名为WeeksPerLongYear
v2.6.2 (2025-04-08)
✨ 新功能
- 新增格式符号
o来获取时区偏移量 - 新增
TimestampLayout、TimestampMilliLayout、TimestampMicroLayout和TimestampNanoLayout常量 - 新增
TimestampFormat、TimestampMilliFormat、TimestampMicroFormat和TimestampNanoFormat常量 - 新增
DateTimeMilli、DateTimeMicro、DateTimeNano字段类型 - 新增
DateMilli、DateMicro、DateNano字段类型 - 新增
TimeMilli、TimeMicro、TimeNano字段类型 - 新增
MaxDuration、MinDuration方法
🐛 修复
- 修复农历中
IsLeapMonth判断错误的 bug - 修复
AtomFormat和AtomLayout格式返回值不一致的 bug - 修复
RFC3339Format和RFC3339Layout格式返回值不一致的 bug - 修复
IsDST方法丢失时区的 bug - 修复
StartOfXXX、EndOfXXX部分方法丢失时区的 bug - 修复其他日历转化为公历时缺失时区的 bug
♻️ 重构与变更
CreateFromLunar,CreateFromPersian方法去掉 hour, minute, second 参数- 更改部分格式符号定义,涉及到的符号有
U,V,X,S,TZ,u,v,x,z - 设置全局默认时区时不再同步更新
time.Local
v2.6.1 (2025-03-27)
✨ 新功能
- 新增
ParseWithLayouts和ParseWithFormats方法
🐛 修复
- 修复
gorm更新数据时updated_at字段自动更新无效的 bug
♻️ 重构与变更
- 将
layoutFactory接口更名为LayoutFactory,formatFactory接口更名为FormatFactory,timestampFactory接口更名为TimestampFactory, 并添加类型约束 - 将
LayoutType,FormatType,TimestampType结构体GormDataType方法的返回值更改为time - 将
DateTime、Date、Time类型从struct更改为string - 将
Timestamp、TimestampMilli、TimestampMicro,TimestampNano类型从struct更改为int64 - 将内置数据库字段类型移动到新文件
types.go
v2.6.0 (2025-03-25)
✨ 新功能
- 新增
ZoneName方法获取时区名称 - 新增
HasError方法判断是否有错误 - 新增
IsNil方法判断是否是nil - 新增
Copy方法对carbon进行深度复制 - 新增
WeekStartsAt方法获取周起始日期 - 新增示例文件
xxx_example.go - 新增
constant.go文件,将常量从carbon.go文件迁移到此文件
♻️ 重构与变更
golang最低版本依赖升级到1.18carbon,julian,lunar,persian从值传递改成指针传递- 默认全局时区从
Local更改为UTC Offset方法更名为ZoneOffsetIsSetTestNow方法更名为IsTestNowUnSetTestNow方法更名为CleanTestNow- 移除
Location方法,由Timezone方法替代 - 更改
IsValid和IsInvalid方法判断逻辑,zero time不再视为无效时间 - 设置全局默认时区时同步更新
time.Local - 重构
database.go,移除carbon.DateTime、carbon. DateTimeMilli、carbon.DateTimeMicro、carbon.DateTimeNano、carbon. Date、carbon.DateMilli、carbon.DateMicro、carbon.DateNano、carbon.Time、carbon.TimeMilli、carbon.TimeMicro、carbon.TimeNano、carbon.Timestamp、carbon.TimestampMilli、carbon.TimestampMicro、carbon.TimestampNano字段类型, 使用泛型字段替代以实现MarshalJSON/UnmarshalJSON时自定义输出格式
有关更早版本的更新日志,请参阅 releases