marshal/unmarshal 后当地时间丢失 52 秒
怎么入门Golang编程?需要学习哪些知识点?这是新手们刚接触编程时常见的问题;下面golang学习网就来给大家整理分享一些知识点,希望能够给初学者一些帮助。本篇文章就来介绍《marshal/unmarshal 后当地时间丢失 52 秒》,涉及到,有需要的可以收藏一下
我解析 local 中的时间,将其编组为 json,然后取消编组,然后时间不再匹配。
timeA, _ := time.ParseInLocation("15:04", "8:00", time.Local)
jBytes, _ := json.Marshal(timeA)
var timeB time.Time
json.Unmarshal(jBytes, &timeB)
fmt.Printf("Time A: %+v, Time B: %+v\n", timeA, timeB)
fmt.Printf("Time A: %+v, Time B: %+v\n", timeA.Local(), timeB.Local())
fmt.Printf("Diff: %s\n", timeA.Sub(timeB))
fmt.Printf("Marshaled: %s", string(jBytes))
时间 a:0000-01-01 08:00:00 -0733 lmt,时间 b:0000-01-01 08:00:00 -0733 -0733 时间 a:0000-01-01 08:00:00 -0733 lmt,时间 b:0000-01-01 07:59:08 -0733 lmt 差异:52秒 编组:“0000-01-01t08:00:00-07:33”
它在 linux 上运行,埃德蒙顿/山作为我的当地时间,所以我猜它无法识别位置并显示偏移两次 -733 -733。当我调用 local 时,由于某种原因,解析后的结果始终会丢失 52 秒。
我希望时间能够匹配。我的时钟与它所参考的远程时钟相差 52 秒吗?
解决方案
1906 年 9 月 1 日之前,您的时区差异为 utc-7:33:52。 json.unmarshal 只是使用封送文本中的 7:33 作为偏移量,而不是正确的值 7:33:52,因此它计算的 time.time 值偏离了 52 秒。但是您的 time.local 实现似乎是正确的(在某种程度上,我们可以将回溯到第一年的时区差异描述为“正确”)并从 time.time 值中减去完整的 7:33:52,从而得到你所看到的差异。
如果输出:
fmt.printf("time a: %+v, time b: %+v\n", timea.utc(), timeb.utc())
使用当前代码,您应该看到 timeb 的 utc 时间在解组后设置为 15:33:00,而 timea 的 utc 时间设置为 15:33:52。我怀疑如果您在时间字符串中包含 1906 年之后的一年,您会发现这 52 秒的差异消失了。
例如:
package main
import (
"encoding/json"
"fmt"
"log"
"time"
)
func main() {
zone, err := time.loadlocation("america/edmonton")
if err != nil {
log.fatalf("%v", err)
}
for _, timestring := range []string{
"01 02 1905 8:00",
"01 02 1907 8:00",
} {
timea, err := time.parseinlocation("01 02 2006 15:04", timestring, zone)
if err != nil {
log.fatalf("%v", err)
}
jbytes, _ := json.marshal(timea)
var timeb time.time
json.unmarshal(jbytes, &timeb)
fmt.printf("time string: %s\n", timestring)
fmt.printf("time a: %+v, time b: %+v\n", timea, timeb)
fmt.printf("time a: %+v, time b: %+v\n", timea.utc(), timeb.utc())
fmt.printf("time a: %+v, time b: %+v\n", timea.in(zone), timeb.in(zone))
fmt.printf("diff: %s\n", timea.sub(timeb))
fmt.printf("marshaled: %s\n", string(jbytes))
}
}
输出:
paul@mac:got$ ./got time string: 01 02 1905 8:00 time a: 1905-01-02 08:00:00 -0733 lmt, time b: 1905-01-02 08:00:00 -0733 -0733 time a: 1905-01-02 15:33:52 +0000 utc, time b: 1905-01-02 15:33:00 +0000 utc time a: 1905-01-02 08:00:00 -0733 lmt, time b: 1905-01-02 07:59:08 -0733 lmt diff: 52s marshaled: "1905-01-02t08:00:00-07:33" time string: 01 02 1907 8:00 time a: 1907-01-02 08:00:00 -0700 mst, time b: 1907-01-02 08:00:00 -0700 -0700 time a: 1907-01-02 15:00:00 +0000 utc, time b: 1907-01-02 15:00:00 +0000 utc time a: 1907-01-02 08:00:00 -0700 mst, time b: 1907-01-02 08:00:00 -0700 mst diff: 0s marshaled: "1907-01-02t08:00:00-07:00" paul@mac:got$
显示 1905 年存在 52 秒差异,但在时区差异更改为直接 utc-7:00:00 后,1907 年不存在 52 秒差异。
简短回答:默认情况下编组到 json 和从 json 解组似乎无法正确处理时区偏移量中的秒数,因为编组字符串的偏移量中没有秒数出现,并且这是 json.unmarshal 可用的唯一时区信息它。
可以肯定的是,在任何代码中都没有引用时钟(无论是远程时钟还是其他时钟)——它只是操纵值。
您默认使用伪日期 0000-01-01,而当地时间可能基于太阳中午的位置。
简单地解析一天中的时间。例如,
package main
import (
"encoding/json"
"fmt"
"time"
)
func main() {
timea, err := time.parse("15:04", "8:00")
fmt.println(timea, err)
jbytes, _ := json.marshal(timea)
var timeb time.time
json.unmarshal(jbytes, &timeb)
fmt.printf("time a: %+v, time b: %+v\n", timea, timeb)
fmt.printf("diff: %s\n", timea.sub(timeb))
fmt.printf("marshaled: %s\n", string(jbytes))
}
输出:
0000-01-01 08:00:00 +0000 UTCTime A: 0000-01-01 08:00:00 +0000 UTC, Time B: 0000-01-01 08:00:00 +0000 UTC Diff: 0s Marshaled: "0000-01-01T08:00:00Z"
今天关于《marshal/unmarshal 后当地时间丢失 52 秒》的内容就介绍到这里了,是不是学起来一目了然!想要了解更多关于的内容请关注golang学习网公众号!
使用Python与腾讯云接口对接,实现人脸比对功能
- 上一篇
- 使用Python与腾讯云接口对接,实现人脸比对功能
- 下一篇
- 用PHP实现严格判断:数字和字母的限制
-
- Golang · Go问答 | 12小时前 | 并发 · time · 定时任务 · Timer · Ticker · Go问答 · 定时器 Go 定时任务 停止 time.Ticker time.After time.NewTimer
- Go 定时任务怎么选 time.After、time.NewTimer 和 time.Ticker:避免循环等待与停止失效
- 144浏览 收藏
-
- Golang · Go问答 | 13小时前 | golang · TLS · Go问答 · Go 1.26 · crypto/tls · 安全升级 · crypto/tls Go 1.26 ML-KEM 后量子密码 TLS兼容性
- Go 1.26 crypto/tls 后量子混合密钥交换默认开启:老客户端怎么验证兼容性
- 420浏览 收藏
-
- Golang · Go问答 | 17小时前 |
- Go 的 io.Copy 为什么会突然变慢:ReaderFrom、WriterTo 与包装器边界
- 251浏览 收藏
-
- Golang · Go问答 | 17小时前 | 并发 · 错误处理 · go · Context · 取消原因 WithCancelCause Go context.Cause context.Err
- Go context.Cause 怎么保留取消原因:WithCancelCause、Err 与跨层传递
- 428浏览 收藏
-
- Golang · Go问答 | 18小时前 | [] · []
- Go embed.FS 里 fs.Sub 为什么读不到文件:路径、斜杠与工作目录边界
- 449浏览 收藏
-
- Golang · Go问答 | 18小时前 |
- Go API 接收分页参数如何防整数溢出:strconv、边界值与数据库 LIMIT
- 225浏览 收藏
-
- Golang · Go问答 | 19小时前 |
- Go slices.Chunk 怎么做批量处理:空批次、底层数组与边界测试
- 127浏览 收藏
-
- Golang · Go问答 | 20小时前 | [] · []
- Go errors.Is 为什么匹配不到:%w 包装、errors.Join 与自定义错误判定
- 407浏览 收藏
-
- Golang · Go问答 | 20小时前 | 并发 · 故障排查 · Go问答 · encoding/json · 配置中心 · sync/atomic · encoding/json atomic.Value Go配置热加载 Decoder 配置复用 旧值残留
- Go 配置热加载为什么偶发读到旧值:JSON 复用、零值覆盖与原子替换
- 311浏览 收藏
-
- Golang · Go问答 | 1天前 | WebAssembly · Go问答 · 前端交互 · 浏览器存储 · syscall/js · Go localStorage WebAssembly syscall/js js/wasm Wasm运行时脚本
- Go WebAssembly 怎么读写 localStorage:syscall/js 的边界、异常与加载检查
- 122浏览 收藏
-
- Golang · Go问答 | 2天前 | 并发 · 单元测试 · go · Context · AfterFunc · Go问答 context.AfterFunc context.CancelFunc Go回调
- Go context.AfterFunc 怎么避免重复回调:Stop 竞态窗口与测试方法
- 258浏览 收藏
-
- 前端进阶之JavaScript设计模式
- 设计模式是开发人员在软件开发过程中面临一般问题时的解决方案,代表了最佳的实践。本课程的主打内容包括JS常见设计模式以及具体应用场景,打造一站式知识长龙服务,适合有JS基础的同学学习。
- 543次学习
-
- GO语言核心编程课程
- 本课程采用真实案例,全面具体可落地,从理论到实践,一步一步将GO核心编程技术、编程思想、底层实现融会贯通,使学习者贴近时代脉搏,做IT互联网时代的弄潮儿。
- 516次学习
-
- 简单聊聊mysql8与网络通信
- 如有问题加微信:Le-studyg;在课程中,我们将首先介绍MySQL8的新特性,包括性能优化、安全增强、新数据类型等,帮助学生快速熟悉MySQL8的最新功能。接着,我们将深入解析MySQL的网络通信机制,包括协议、连接管理、数据传输等,让
- 500次学习
-
- JavaScript正则表达式基础与实战
- 在任何一门编程语言中,正则表达式,都是一项重要的知识,它提供了高效的字符串匹配与捕获机制,可以极大的简化程序设计。
- 487次学习
-
- 从零制作响应式网站—Grid布局
- 本系列教程将展示从零制作一个假想的网络科技公司官网,分为导航,轮播,关于我们,成功案例,服务流程,团队介绍,数据部分,公司动态,底部信息等内容区块。网站整体采用CSSGrid布局,支持响应式,有流畅过渡和展现动画。
- 485次学习
-
- ljg-skills
- ljg-skills 是李继刚开源的 AI 技能与提示词集合,面向大模型使用者整理了一批可复用的 prompt、角色设定和任务技能模板,适合用于学习提示词设计、搭建个人 AI 工作流和沉淀团队常用智能体能力。
- 4797次使用
-
- MELO音乐
- MELO音乐是一站式AI视频与音乐制作助手,对标suno, udio的高品质体验。提供伴奏生成、原创写词、无损导出、哼唱识曲、混音变声等全套音频与短视频编辑工具。无论是流行Kpop、电音说唱、民谣古风、摇滚儿歌还是商用轻音乐,MELO为你免费谱曲,轻松做同款!
- 4391次使用
-
- UniScribe
- UniScribe 是一款 AI 音视频转文字与内容整理工具,支持上传音频、视频文件或粘贴 YouTube 链接,自动生成转写文本、摘要、思维导图和关键问题,并支持多格式导出,适合会议记录、课程学习、访谈整理和内容创作复盘。
- 4334次使用
-
- 剧云
- 剧云是专业中文剧本创作平台,安全稳定运行十余年,集成AI编剧、剧本医生审核、人物小传、剧情关系图、大纲编写、多人协作、Word导入导出、版权管控功能,数据安全防护,轻松高效创作剧本。
- 4573次使用
-
- 万象有声
- 万象有声,一个专为有声创作者打造的新一代智能有声内容创作平台。平台提供专业的智能拆章、智能画本编辑、AI配音、AI生成音效、后期制作、智能对轨、智能审听等有声创作全流程工具,可以帮助创作者高效、低成本创作出引人入胜的有声作品。立即体验,让有声书制作更简单!
- 4515次使用
-
- 用Nginx反向代理部署go写的网站。
- 2023-01-17 502浏览
-
- GoLand调式动态执行代码
- 2023-01-13 502浏览
-
- Go bufio.Scanner 遇到 token too long 怎么办:大日志行的长度上限与内存取舍
- 2026-07-22 501浏览
-
- 从不同的 go 例程将数据写入同一通道无需等待组即可正常工作
- 2024-04-29 501浏览
-
- Golang rsa-oaep解密失败,前端使用webcrypto
- 2024-04-26 501浏览

