时间戳转换-Go(项目又进一步哦~)

kaiyuan10nian · · 1978 次点击 · · 开始浏览    
这是一个创建于 的文章,其中的信息可能已经有所发展或是发生改变。

公众号/小程序:开源十年 github地址:https://github.com/kaiyuan10nian/kaiyuan10nian 想加入的可以去公众号下面认领开发任务哦~ ---- 时间戳转换在日常工作中经常会用到,有没有想过为什么用时间戳而不是用日期呢? 跨平台---主要就是解决这个问题,因为不同的数据库不同的语言之间针对时间类型有不同的解释,而且有的系统date是不允许直接兼容转换的,或者你做数据迁移的时候,值好迁移但是类型怎么迁移? 所以在这个时候就凸显了时间戳的重要性。 但是时间戳就是一串数字,我们平时调试或者阅读的时候是不认识它的,所以时间戳转换就使用的非常频繁。 本节主要分享怎么使用Go实现的时间戳转换以及使用fyne实现了该功能。 #### 首先安装fyne: ``` go get fyne.io/fyne/v2 ``` #### 界面开发 外观和质量缺一不可,我们使用Go一般主要做后端逻辑开发,但还是强烈建议各位玩一下前端,前后端在开发逻辑上还是有点不同的,只有都经历过才能成长为一名合格的菜鸟。 看代码: ```Go /* *时间戳和日期的相互转换功能实现 *params: *app:由主界面传过来的fyne.App实例 */ func TimeStampChange(app fyne.App) fyne.Window { myWindow := app.NewWindow("时间戳转换")//窗口名称 title := canvas.NewText("时间戳转换", color.Black)//页面标题 content := container.New(layout.NewHBoxLayout(), title, layout.NewSpacer())//控制title位置 //获取当前时间戳 timeNow := canvas.NewText("现在:", color.Black) clockTimeTamp := widget.NewLabel("") //时间戳输入框 inputTimeStamp := widget.NewEntry() btnCopy := widget.NewButton("使用", func() { log.Println("tapped") inputTimeStamp.SetText(clockTimeTamp.Text) }) //更新时间戳 updateTime(clockTimeTamp) row1 := container.New(layout.NewHBoxLayout(), timeNow, clockTimeTamp, btnCopy, layout.NewSpacer())//控制显示位置 timeStamp := canvas.NewText("时间戳:", color.Black) inputTimeStamp.SetPlaceHolder("输入时间戳") row2_1 := container.New(layout.NewGridWrapLayout(fyne.NewSize(120, 40)), inputTimeStamp) combo := widget.NewSelect([]string{"秒(s)", "毫秒(ms)"}, func(value string) { log.Println("Select set to", value) }) combo.SetSelected("秒(s)") row2_2 := container.New(layout.NewGridWrapLayout(fyne.NewSize(100, 40)), combo) //转换结果显示 turnResult := widget.NewEntry() turnResult.SetPlaceHolder("转换结果") row2_3 := container.New(layout.NewGridWrapLayout(fyne.NewSize(160, 40)), turnResult) //根据用户选择的秒还是毫秒来进行转换 btnTurn := widget.NewButton("转换>", func() { var timetamp = "" if combo.Selected == "秒(s)" { timetamp = timeStamps2Date(inputTimeStamp.Text) } else { timetamp = timeStampMs2Date(inputTimeStamp.Text) } turnResult.SetText(timetamp) }) beijingTimeStr := canvas.NewText("北京时间", color.Gray{0x99}) row2 := container.New(layout.NewHBoxLayout(), timeStamp, row2_1, row2_2, btnTurn, row2_3, beijingTimeStr) //下面同理,是上面的逆序 timeDate := canvas.NewText("时间:", color.Black) inputDate := widget.NewEntry() inputDate.SetPlaceHolder("请输入日期") row3_1 := container.New(layout.NewGridWrapLayout(fyne.NewSize(160, 40)), inputDate) beijingTimeStr1 := canvas.NewText("北京时间", color.Gray{0x99}) turnResult_date := widget.NewEntry() combo_date := widget.NewSelect([]string{"秒(s)", "毫秒(ms)"}, func(value string) { log.Println("Select set to", value) }) combo_date.SetSelected("秒(s)") row3_2 := container.New(layout.NewGridWrapLayout(fyne.NewSize(100, 40)), combo_date) btnTurn_date := widget.NewButton("转换>", func() { var timetamp = "" if combo_date.Selected == "秒(s)" { timetamp = date2timeStamps(inputDate.Text) } else { timetamp = date2timeStampMs(inputDate.Text) } turnResult_date.SetText(timetamp) }) turnResult_date.SetPlaceHolder("转换结果") row3_3 := container.New(layout.NewGridWrapLayout(fyne.NewSize(160, 40)), turnResult_date) row3 := container.New(layout.NewHBoxLayout(), timeDate, row3_1, beijingTimeStr1, btnTurn_date, row3_3, row3_2) //最后把上面画的页面都装进布局里面,排序 myWindow.SetContent(container.New(layout.NewVBoxLayout(), content, row1, row2, row3)) myWindow.Resize(fyne.NewSize(600, 300)) go func() { for range time.Tick(time.Second) { updateTime(clockTimeTamp) } }() //最后把这个窗口返回给app,那边在用户点击的时候会调用show去显示出来 return myWindow } ``` #### 工具函数准备 提到时间戳大多都知道秒和毫秒两种,有的时候用毫秒有的时候用秒,毫秒要比秒更加的精确。两者之间是1000倍的一个差距,所以在准备转换函数时我们也做两手准备: ```Go //秒时间戳转日期 func timeStamps2Date(timestamp string) string { timetamp, _ := strconv.Atoi(timestamp) timeTemplate := "2006-01-02 15:04:05"//在Go里面用这个格式不要换不然你会发现新大陆哦~(文末有彩蛋) tm := time.Unix(int64(timetamp), 0) timeStr := tm.Format(timeTemplate) return timeStr } //日期转秒时间戳 func date2timeStamps(dateStr string) string { TimeLocation, _ := time.LoadLocation("Asia/Shanghai") //获取北京时间时区,很重要 times, _ := time.ParseInLocation("2006-01-02 15:04:05", dateStr, TimeLocation) timeUnix := times.Unix() return strconv.Itoa(int(timeUnix)) } //毫秒时间戳转日期 func timeStampMs2Date(timestamp string) string { timetamp, _ := strconv.Atoi(timestamp) timeTemplate := "2006-01-02 15:04:05" tm := time.UnixMilli(int64(timetamp)) timeStr := tm.Format(timeTemplate) return timeStr } //日期转毫秒时间戳 func date2timeStampMs(dateStr string) string { TimeLocation, _ := time.LoadLocation("Asia/Shanghai") //获取北京时间时区,很重要 times, _ := time.ParseInLocation("2006-01-02 15:04:05", dateStr, TimeLocation) timeUnix := times.UnixMilli() return strconv.Itoa(int(timeUnix)) } ``` 上面的代码基本瞜一眼也就明白怎么回事了,但是其中有两点要注意: - 格式化日期必要按照代码中的来; - 日期转时间戳必须先获取时区; #### END 完成,截止目前该功能已经完成了,我们看一下效果: ![WechatIMG438.png](https://static.golangjob.cn/221114/192712a7d6c6ec367c7b37034ff8b115.png) 这是主界面(无设计,纯程序员视觉0.0) ![WechatIMG439.png](https://static.golangjob.cn/221114/b7a63d013b7e9fd5959c5ddcd566752c.png) 这是具体功能是使用界面 :( #### 彩蛋 为什么在Go里面要用”2006-01-02 15:04:05“固定格式? 不管是java还是php亦或者其他语言没有这么玩的,为什么Go就是这么另类呢? 其实呀,它这个设计还真的是别出心裁。 针对常规的格式转换我们直接yyyy-mm-dd肯定方便呀,但是在有些语言里面处理 22年11月14日这种格式的时候就麻爪了,不去好好百度百度基本你是写不出来的。 而用Go就好办了,只要对应的值改一下就行”06-01-02 15:04:05“ Go设计原则之一就是:大道至简,在设计的时候是有道道可讲的,是按照ANSIC标准的日期格式,月、日、时、分、秒、年,最后再加上MST时区,分别对应1 2 3 4 5 6 7,同时还可以随意加星期几。有兴趣的话可以去好好研究下,对于我们菜鸟来说记住这个日期就行了。

有疑问加站长微信联系(非本文作者))

入群交流(和以上内容无关):加入Go大咖交流群,或添加微信:liuxiaoyan-s 备注:入群;或加QQ群:692541889

1978 次点击  
加入收藏 微博
暂无回复
添加一条新回复 (您需要 登录 后才能回复 没有账号 ?)
  • 请尽量让自己的回复能够对别人有帮助
  • 支持 Markdown 格式, **粗体**、~~删除线~~、`单行代码`
  • 支持 @ 本站用户;支持表情(输入 : 提示),见 Emoji cheat sheet
  • 图片支持拖拽、截图粘贴等方式上传