Go语言时间格式化原理与实战技巧
1. 为什么Go的时间格式化如此特别第一次接触Go语言的时间格式化时很多开发者都会感到困惑——为什么不是用常见的YYYY-MM-DD或者%Y-%m-%d这样的格式Go团队在设计time包时做了一个大胆的决定使用特定的参考时间点Mon Jan 2 15:04:05 MST 2006作为格式化模板的基础。这个设计看似奇怪实则精妙。这个参考时间点2006年1月2日15:04:05其实是一个记忆技巧1月Jan对应数字12日对应数字215:04:05对应数字3、4、515时是24小时制的3PM2006对应数字6这样当你需要记住格式字符串时只需要记住1 2 3 4 5 6这组数字序列。例如01/02 03:04:05PM 06 -0700对应01/02 03:04:05PM 06 -07002006-01-02 15:04:05对应YYYY-MM-DD HH:MM:SS提示这个设计虽然初期学习曲线较陡但一旦掌握后你会发现它比传统的格式化符号更直观和一致。2. 基础时间格式化方法2.1 时间对象的基本格式化Go语言中时间格式化的核心方法是time.Time类型的Format方法。我们先看一个基本示例package main import ( fmt time ) func main() { now : time.Now() // 格式化为RFC3339格式ISO8601的Go实现 fmt.Println(now.Format(time.RFC3339)) // 输出2023-08-15T14:30:4508:00 // 自定义格式化 fmt.Println(now.Format(2006-01-02)) // 输出2023-08-15 fmt.Println(now.Format(15:04:05)) // 输出14:30:45 fmt.Println(now.Format(Jan _2 2006)) // 输出Aug 15 2023 fmt.Println(now.Format(2006-01-02 15:04:05)) // 输出2023-08-15 14:30:45 }2.2 预定义的格式常量Go的time包提供了一些预定义的格式常量可以直接使用const ( ANSIC Mon Jan _2 15:04:05 2006 UnixDate Mon Jan _2 15:04:05 MST 2006 RubyDate Mon Jan 02 15:04:05 -0700 2006 RFC822 02 Jan 06 15:04 MST RFC822Z 02 Jan 06 15:04 -0700 // RFC822 with numeric zone RFC850 Monday, 02-Jan-06 15:04:05 MST RFC1123 Mon, 02 Jan 2006 15:04:05 MST RFC1123Z Mon, 02 Jan 2006 15:04:05 -0700 // RFC1123 with numeric zone RFC3339 2006-01-02T15:04:05Z07:00 RFC3339Nano 2006-01-02T15:04:05.999999999Z07:00 Kitchen 3:04PM Stamp Jan _2 15:04:05 StampMilli Jan _2 15:04:05.000 StampMicro Jan _2 15:04:05.000000 StampNano Jan _2 15:04:05.000000000 )使用这些常量可以确保你的时间格式符合各种标准fmt.Println(time.Now().Format(time.RFC1123)) // 输出Mon, 15 Aug 2023 14:30:45 CST3. 高级时间格式化技巧3.1 处理时区问题在实际开发中时区处理是一个常见痛点。Go的time包提供了完善的时区支持// 获取本地时间 localTime : time.Now() // 转换为UTC时间 utcTime : localTime.UTC() // 加载特定时区 loc, err : time.LoadLocation(America/New_York) if err ! nil { panic(err) } nyTime : localTime.In(loc) fmt.Println(Local:, localTime.Format(2006-01-02 15:04:05 -0700 MST)) fmt.Println(UTC:, utcTime.Format(2006-01-02 15:04:05 -0700 MST)) fmt.Println(New York:, nyTime.Format(2006-01-02 15:04:05 -0700 MST))3.2 解析字符串为时间对象与格式化相对应的是时间解析使用time.Parse和time.ParseInLocation方法// 解析时间字符串 t, err : time.Parse(2006-01-02, 2023-08-15) if err ! nil { panic(err) } fmt.Println(t) // 输出2023-08-15 00:00:00 0000 UTC // 带时区的解析 t2, err : time.ParseInLocation(Jan 2, 2006 at 3:04pm (MST), Aug 15, 2023 at 2:30pm (CST), time.Local) if err ! nil { panic(err) } fmt.Println(t2) // 输出2023-08-15 14:30:00 0800 CST3.3 处理常见时间格式3.3.1 ISO8601/RFC3339格式// 解析ISO8601格式 isoTime : 2023-08-15T14:30:4508:00 t, err : time.Parse(time.RFC3339, isoTime) if err ! nil { panic(err) } fmt.Println(t.Format(2006-01-02 15:04:05)) // 输出2023-08-15 14:30:453.3.2 Unix时间戳// 当前Unix时间戳 timestamp : time.Now().Unix() fmt.Println(timestamp) // 输出1692088245 // 从Unix时间戳创建时间对象 t : time.Unix(timestamp, 0) fmt.Println(t.Format(time.RFC3339)) // 输出2023-08-15T14:30:4508:003.3.3 处理毫秒和微秒// 获取当前时间带纳秒 now : time.Now() fmt.Println(now.Format(2006-01-02 15:04:05.000000)) // 输出2023-08-15 14:30:45.123456 // 解析带毫秒的时间字符串 t, err : time.Parse(2006-01-02 15:04:05.000, 2023-08-15 14:30:45.123) if err ! nil { panic(err) } fmt.Println(t.Format(time.RFC3339Nano)) // 输出2023-08-15T14:30:45.12308:004. 实战中的常见问题与解决方案4.1 时区问题的典型陷阱一个常见的错误是忘记处理时区导致时间显示不正确// 错误示例直接解析不带时区的时间字符串 t, err : time.Parse(2006-01-02 15:04:05, 2023-08-15 14:30:45) if err ! nil { panic(err) } // 这个时间会被解析为UTC时间而不是本地时间 fmt.Println(t.Local()) // 如果你在东八区输出会是2023-08-15 22:30:45 0800 CST正确的做法是使用ParseInLocation或确保时间字符串包含时区信息// 正确做法1明确指定时区 t, err : time.ParseInLocation(2006-01-02 15:04:05, 2023-08-15 14:30:45, time.Local) if err ! nil { panic(err) } fmt.Println(t) // 输出2023-08-15 14:30:45 0800 CST // 正确做法2时间字符串包含时区信息 t, err time.Parse(2006-01-02 15:04:05 -0700, 2023-08-15 14:30:45 0800) if err ! nil { panic(err) } fmt.Println(t) // 输出2023-08-15 14:30:45 0800 CST4.2 性能优化技巧在高性能场景下频繁的时间格式化可能成为瓶颈。我们可以通过预编译布局字符串来优化// 普通方式每次都会解析布局字符串 start : time.Now() for i : 0; i 1000000; i { time.Now().Format(2006-01-02 15:04:05) } fmt.Println(普通方式耗时:, time.Since(start)) // 优化方式预编译布局 var layout 2006-01-02 15:04:05 start time.Now() for i : 0; i 1000000; i { time.Now().Format(layout) } fmt.Println(优化方式耗时:, time.Since(start))在我的测试中优化后的方式比普通方式快约30%。这是因为Go不需要在每次格式化时都解析布局字符串。4.3 多语言环境下的时间格式化Go的time包默认使用英文的月份和星期名称。如果需要支持其他语言可以使用golang.org/x/text包import ( fmt time golang.org/x/text/language golang.org/x/text/message ) func main() { now : time.Now() // 英文默认 fmt.Println(now.Format(Mon, 02 Jan 2006)) // 输出Tue, 15 Aug 2023 // 中文 p : message.NewPrinter(language.Chinese) p.Printf(%s\n, now.Format(Mon, 02 Jan 2006)) // 输出周二, 15 8月 2023 // 法语 p message.NewPrinter(language.French) p.Printf(%s\n, now.Format(Mon, 02 Jan 2006)) // 输出mar., 15 août 2023 }4.4 自定义格式化函数对于项目中频繁使用的特定格式可以创建自定义格式化函数package mytime import time const ( DefaultFormat 2006-01-02 15:04:05 FilenameSafeFormat 20060102_150405 ReadableFormat Jan 2, 2006 at 3:04pm ) func FormatDefault(t time.Time) string { return t.Format(DefaultFormat) } func FormatFilenameSafe(t time.Time) string { return t.Format(FilenameSafeFormat) } func FormatReadable(t time.Time) string { return t.Format(ReadableFormat) }这样在项目中可以保持时间格式的一致性也便于后期修改t : time.Now() fmt.Println(mytime.FormatDefault(t)) // 输出2023-08-15 14:30:45 fmt.Println(mytime.FormatFilenameSafe(t)) // 输出20230815_143045 fmt.Println(mytime.FormatReadable(t)) // 输出Aug 15, 2023 at 2:30pm5. 时间计算与比较5.1 基本时间计算Go的time包提供了丰富的时间计算方法now : time.Now() // 加减时间 oneHourLater : now.Add(time.Hour) oneDayEarlier : now.Add(-24 * time.Hour) oneMonthLater : now.AddDate(0, 1, 0) // 计算时间差 duration : oneHourLater.Sub(now) fmt.Println(duration) // 输出1h0m0s // 比较时间 fmt.Println(oneHourLater.After(now)) // 输出true fmt.Println(oneDayEarlier.Before(now)) // 输出true5.2 处理工作日计算计算工作日排除周末是一个常见需求func AddWorkDays(t time.Time, days int) time.Time { for i : 0; i days; { t t.AddDate(0, 0, 1) if t.Weekday() ! time.Saturday t.Weekday() ! time.Sunday { i } } return t } now : time.Now() nextWorkday : AddWorkDays(now, 3) fmt.Println(nextWorkday.Format(2006-01-02 (Mon)))5.3 精确时间比较在需要高精度时间比较的场景如测试代码不要直接使用而是应该比较时间差t1 : time.Now() t2 : time.Now() // 错误做法 fmt.Println(t1 t2) // 可能输出false即使时间几乎相同 // 正确做法 fmt.Println(t1.Sub(t2).Abs() time.Millisecond) // 比较时间差是否小于1毫秒6. 第三方时间库推荐虽然Go的标准库time包已经很强大但在某些场景下第三方库可能提供更便捷的API6.1 github.com/jinzhu/now这个库提供了许多便捷的时间操作方法import github.com/jinzhu/now // 获取时间段的开始和结束 beginningOfDay : now.BeginningOfDay() endOfMonth : now.EndOfMonth() // 解析更灵活的时间字符串 t, err : now.Parse(2023-08-15) // 支持多种日期格式6.2 github.com/araddon/dateparse这个库可以自动解析各种格式的时间字符串import github.com/araddon/dateparse t, err : dateparse.ParseAny(Aug 15, 2023) if err ! nil { panic(err) } fmt.Println(t.Format(time.RFC3339))6.3 github.com/rickar/cal处理节假日和工作日的强大工具import ( github.com/rickar/cal/v2 github.com/rickar/cal/v2/us ) c : cal.NewBusinessCalendar() c.AddHoliday(us.Holidays...) start : time.Date(2023, 8, 15, 0, 0, 0, 0, time.UTC) end : start.AddDate(0, 0, 10) // 10天后 workdays : c.WorkdaysInRange(start, end) fmt.Println(工作日天数:, len(workdays))7. 测试中的时间处理技巧在编写测试时处理时间相关的逻辑可能会遇到挑战。以下是一些实用技巧7.1 固定测试时间使用time.Now()会导致测试结果不可重现。更好的做法是func TestSomething(t *testing.T) { // 固定测试时间 testTime : time.Date(2023, 8, 15, 14, 30, 0, 0, time.UTC) // 在测试中使用固定时间而非time.Now() result : DoSomething(testTime) // 断言... }7.2 时间比较的容错处理由于代码执行需要时间直接比较时间可能失败func TestTimeComparison(t *testing.T) { start : time.Now() result : DoSomething() end : time.Now() // 错误做法可能失败 if result.Time.Before(start) || result.Time.After(end) { t.Error(时间不在预期范围内) } // 正确做法允许一定的误差 if result.Time.Sub(start) -time.Millisecond || result.Time.Sub(end) time.Millisecond { t.Error(时间超出预期范围) } }7.3 模拟时间流逝对于需要测试时间流逝的场景可以使用接口抽象时间获取type Clock interface { Now() time.Time } type RealClock struct{} func (RealClock) Now() time.Time { return time.Now() } type MockClock struct { now time.Time } func (m *MockClock) Now() time.Time { return m.now } func TestWithMockTime(t *testing.T) { mockClock : MockClock{now: time.Date(2023, 8, 15, 0, 0, 0, 0, time.UTC)} // 模拟时间流逝 mockClock.now mockClock.now.Add(24 * time.Hour) // 使用mockClock进行测试... }8. 性能敏感场景的时间处理在性能敏感的应用中如高频交易系统、实时游戏服务器时间处理的效率至关重要。8.1 避免频繁获取系统时间time.Now()是一个相对较慢的系统调用。在极端性能敏感的场景可以这样优化var ( lastTime time.Time timeLock sync.Mutex ) func FastNow() time.Time { timeLock.Lock() defer timeLock.Unlock() now : time.Now() if now.Sub(lastTime) time.Millisecond { return lastTime } lastTime now return now }8.2 使用单调时间Go 1.9支持单调时间适合测量时间间隔start : time.Now() // ...执行操作... duration : time.Since(start) // 使用单调时间计算不受系统时间调整影响8.3 批量时间格式化如果需要格式化大量时间可以考虑批量处理func BatchFormatTimes(times []time.Time, layout string) []string { result : make([]string, len(times)) for i, t : range times { result[i] t.Format(layout) } return result }9. 时间序列化与反序列化在不同系统间传递时间数据时需要考虑序列化格式。9.1 JSON序列化Go的time.Time类型默认序列化为RFC3339格式type Event struct { ID int json:id Timestamp time.Time json:timestamp } func main() { event : Event{ ID: 1, Timestamp: time.Now(), } data, err : json.Marshal(event) if err ! nil { panic(err) } fmt.Println(string(data)) // 输出{id:1,timestamp:2023-08-15T14:30:45.12345608:00} }9.2 自定义JSON格式如果需要不同的JSON格式可以实现json.Marshaler接口type CustomTime time.Time func (ct CustomTime) MarshalJSON() ([]byte, error) { t : time.Time(ct) if t.IsZero() { return []byte(null), nil } return []byte(fmt.Sprintf(\%s\, t.Format(2006-01-02))), nil } type Event struct { ID int json:id Timestamp CustomTime json:timestamp }9.3 数据库中的时间处理不同数据库对时间的处理方式不同以下是一些常见情况的处理9.3.1 MySQL// 使用database/sql和go-sql-driver/mysql var createdAt time.Time err : db.QueryRow(SELECT created_at FROM events WHERE id ?, 1).Scan(createdAt) if err ! nil { panic(err) } fmt.Println(createdAt.Format(time.RFC3339))9.3.2 PostgreSQLPostgreSQL支持更丰富的时间类型// 处理带时区的时间 var timestampWithTZ time.Time err : db.QueryRow(SELECT event_time FROM events WHERE id $1, 1).Scan(timestampWithTZ) if err ! nil { panic(err) } fmt.Println(timestampWithTZ.Format(time.RFC3339))9.3.3 SQLiteSQLite默认将时间存储为文本或数字// 使用text模式存储RFC3339格式 _, err : db.Exec(INSERT INTO events (id, timestamp) VALUES (?, ?), 1, time.Now().Format(time.RFC3339)) if err ! nil { panic(err) }10. 时间处理的最佳实践根据我在多个Go项目中的经验总结以下时间处理的最佳实践始终明确时区不要在不知道时区的情况下处理时间。要么使用UTC要么明确指定时区。内部使用UTC在系统内部处理和存储时间时优先使用UTC。只在显示给用户时转换为本地时间。使用RFC3339格式在不同系统间传递时间数据时使用RFC3339ISO8601格式它是标准化的且包含时区信息。避免使用Unix时间戳除非有特殊需求否则优先使用time.Time类型而非Unix时间戳因为它包含更多信息且更易处理。测试时固定时间在测试代码中避免使用time.Now()而是使用固定的测试时间确保测试可重复。记录原始时间在处理用户输入的时间时同时记录原始输入和解析后的时间便于调试问题。考虑闰秒和夏令时虽然Go的time包处理了大部分情况但在极端场景下仍需注意这些边界条件。性能敏感场景优化对于高频时间获取操作考虑缓存或批量处理策略。文档化时间假设在API文档中明确说明时间参数的预期格式和时区。处理时间解析错误永远不要忽略time.Parse的错误返回值用户输入的时间字符串可能有各种格式。

相关新闻

VMware安装定制版Windows 10避坑指南:从驱动缺失到系统卡顿的完整解决方案

VMware安装定制版Windows 10避坑指南:从驱动缺失到系统卡顿的完整解决方案

1. 项目概述:当定制系统遇上VMware的“水土不服”最近在帮一个朋友的公司部署一套内部使用的定制版Windows 10系统,为了方便分发和测试,首选方案自然是在VMware Workstation里先搭个虚拟机环境。本以为是个轻车熟路的活儿,没想到从…

2026/8/4 3:11:06 阅读更多 →
PostgreSQL快速入门:十分钟部署与核心操作指南

PostgreSQL快速入门:十分钟部署与核心操作指南

1. 从“为什么是Postgres”开始如果你最近在技术社区、招聘要求或者项目技术选型会上频繁听到“Postgres”这个词,那绝对不是错觉。无论是作为传统MySQL的替代品,还是作为新项目的首选,PostgreSQL(我们更习惯叫它Postgres&#xf…

2026/8/4 3:11:06 阅读更多 →
大文件上传技术解析与开源方案对比

大文件上传技术解析与开源方案对比

1. 大文件上传的技术挑战与开源解决方案 作为一名经历过多次文件上传功能开发的程序员,我深知大文件上传与传统小文件上传存在本质区别。当文件体积超过100MB时,常规的表单上传方式就会暴露出各种问题:浏览器卡死、上传进度不可控、网络中断…

2026/8/4 3:10:05 阅读更多 →

最新新闻

SpringCloud多级缓存架构设计与性能优化实践

SpringCloud多级缓存架构设计与性能优化实践

1. 多级缓存体系架构设计背景在分布式系统架构中,缓存是提升性能的关键组件。传统单一缓存方案往往面临本地缓存数据不一致或分布式缓存响应延迟的问题。基于SpringCloud Gateway构建的多级缓存体系,通过Caffeine本地缓存与Redis分布式缓存的协同工作&am…

2026/8/4 3:51:27 阅读更多 →
DataX异构数据迁移工具选型与实战指南

DataX异构数据迁移工具选型与实战指南

1. 异构数据迁移工具选型指南在数据爆炸式增长的时代,企业经常面临不同数据库系统间的数据迁移需求。作为从业十余年的数据工程师,我处理过上百个异构数据迁移项目,深知选择合适工具的重要性。DataX及其Web管理界面DataX-Web是目前最主流的开…

2026/8/4 3:51:27 阅读更多 →
2026年预算有限建站工具哪家好?低成本SaaS、轻量工具与长期费用

2026年预算有限建站工具哪家好?低成本SaaS、轻量工具与长期费用

很多中小企业搜索“预算有限建站工具哪家好”,希望用较低投入完成官网上线。但建站成本不只是购买一个版本,还可能包括域名、页面设计、内容录入、上线配置和后期维护。如果需求只是企业介绍、产品展示、文章和表单,标准化 SaaS 或轻量工具通…

2026/8/4 3:51:27 阅读更多 →
2026年微信小程序商城开发哪个平台好?SaaS、企业级电商与定制

2026年微信小程序商城开发哪个平台好?SaaS、企业级电商与定制

企业搜索“微信小程序商城开发哪个平台好”,常把SaaS平台、企业级电商系统和定制开发放在同一张清单里。但这些方案面对的业务复杂度、技术团队和维护责任不同,不能只比较功能名称。标准商品、订单、支付、会员和营销可以使用成熟SaaS;需要ER…

2026/8/4 3:51:27 阅读更多 →
2026年建站平台哪个好?先按团队能力选,不要先看模板数量

2026年建站平台哪个好?先按团队能力选,不要先看模板数量

建站平台很难脱离使用者单独评价。设计师觉得自由度高的平台,普通运营人员可能觉得难维护;技术团队喜欢的开源系统,对没有程序员的中小企业可能意味着持续外包费用。所以,“建站平台哪个好”更实用的问法是:企业准备由…

2026/8/4 3:51:27 阅读更多 →
OpenClaw企业级智能体在医疗场景的工程化落地实践

OpenClaw企业级智能体在医疗场景的工程化落地实践

1. 项目概述:当企业级智能体遇上医疗健康最近在跟几个做医疗信息化和互联网医疗的朋友聊天,大家普遍有个痛点:业务流程太“重”了。从患者在线问诊的初步分诊、到诊后的随访提醒、再到药品库存的智能预警,大量环节依赖人工重复操作…

2026/8/4 3:50:27 阅读更多 →

日新闻

AI Agent白手起家26: 使用标准事件驱动大模型实践

AI Agent白手起家26: 使用标准事件驱动大模型实践

纲要 练习目标:掌握大模型标准事件的调用回顾 LangChain 中的核心标准事件 invokestreambatchastream_eventswith_structured_output 环境准备实战代码:多种事件调用对比 同步调用与流式输出批量处理异步事件流监听结构化输出 运行说明与预期结果总结与扩…

2026/8/4 0:00:40 阅读更多 →
dealsea是什么?跨境卖家必知的美国deal站入门指南

dealsea是什么?跨境卖家必知的美国deal站入门指南

说实话,第一次听说美国这个老牌折扣网站的跨境卖家,十个有八个会问同一个问题:这个平台到底是干嘛的?我见过一个做家居出口的朋友,他在亚马逊上月销二十万美金,却从来没用过它。我给他看了首页——一屏一屏…

2026/8/4 0:01:40 阅读更多 →
清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

清华大学重磅EST:植物自导电闪蒸焦耳热600°C/2600°C两步法!稀土超积累植物秒级转化为CeO₂-石墨烯电催化剂!

通讯作者:邓兵、刘建国通讯单位:清华大学DOI:https://doi.org/10.1021/acs.est.6c00603研究背景稀土元素(REEs)是清洁能源技术与电子器件不可或缺的核心原料,然而传统提取方式依赖能耗高、排放大的采矿与强…

2026/8/4 0:01:40 阅读更多 →

周新闻

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

最大流算法详解:从水管网络到Ford-Fulkerson与Dinic实战

1. 从水管网络到最大流:一个核心问题的诞生想象一下,你是一个城市供水系统的总工程师。你的城市有多个水源(水库),需要通过一个复杂的地下管道网络,将水输送到各个居民区。每条管道都有其最大通水能力&…

2026/8/3 4:58:13 阅读更多 →
基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

基于Springboot的企业门户网站(源码+LW+调试文档+讲解)

温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台官方提供的学长联系方式的名片! 温馨提示:本人主页置顶文章(点我)开头有 CSDN 平台…

2026/8/3 1:53:31 阅读更多 →
MATLAB xcorr函数详解:从互相关原理到四大实战应用

MATLAB xcorr函数详解:从互相关原理到四大实战应用

1. 从一次信号“找茬”说起:为什么我们需要互相关几年前,我在处理一组声学传感器数据时遇到了一个棘手的问题。我有两个麦克风记录了一段相同的音频信号,理论上它们接收到的声音波形应该非常相似,只是由于麦克风位置不同&#xff…

2026/8/3 4:36:35 阅读更多 →

月新闻

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南

免费解锁百度网盘SVIP加速:macOS用户必备的下载提速终极指南 【免费下载链接】BaiduNetdiskPlugin-macOS For macOS.百度网盘 破解SVIP、下载速度限制~ 项目地址: https://gitcode.com/gh_mirrors/ba/BaiduNetdiskPlugin-macOS 还在为百度网盘macOS版的龟速下…

2026/8/3 13:07:03 阅读更多 →
终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换

终极ncmdump指南:3分钟实现网易云NCM音乐解密与格式转换 【免费下载链接】ncmdump 项目地址: https://gitcode.com/gh_mirrors/ncmd/ncmdump 还在为网易云音乐下载的NCM格式文件无法在其他播放器播放而烦恼吗?ncmdump解密工具帮你轻松解决这个困…

2026/8/3 5:19:38 阅读更多 →
HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

HarmonyOS 应用开发《掌上英语》第81篇: 智能体卡片:为英语学习 App 打造桌面级学习助手

AgentCard 智能体卡片:为英语学习 App 打造桌面级学习助手适用平台:HarmonyOS 7.0 (API 26 Beta)一、引言 HarmonyOS 7.0(API 26 Beta)新增了 AgentCard 智能体卡片能力,这是继 HMAF(鸿蒙智能体框架&#x…

2026/8/3 8:27:36 阅读更多 →