go 时间转时间戳的时区设置问题

昨天遇到一个问题,在完成时间转换时间戳,在后续测试中发现转换后的时间戳转成时间后,时间发生错误,时间和转换时间不一致问题

如下:

复制代码
package main

import (
	"fmt"
	"time"
)

func main() {
	Start := "2024-08-07 14:15:13"
	End := "2024-08-08 14:15:13"
	Layout := "2006-01-02 15:04:05" // 格式

	StartTime, err := time.Parse(Layout, Start)
	if err != nil {
		return
	}
	EndTime, err := time.Parse(Layout, End)
	if err != nil {
		return
	}
	duration := EndTime.Sub(StartTime)
	Hours := uint(duration.Hours())
	// 获取Unix时间戳(秒)
	Startstamp := StartTime.Unix()
	Endstamp := EndTime.Unix()
	msg := fmt.Sprintf("hours: %d, start: %d, end: %d", Hours, Startstamp, Endstamp)
	print(msg)
}

结果:hours: 24, start: 1723040113, end: 1723126513

time.Parse函数可以用来将时间字符串按照指定的布局解析成time.Time类型,但是它默认使用UTC时区,所以转换成时间戳在转成时间和实际相差8小时,需要 time.LoadLocation设置时区,如下:

复制代码
package main

import (
	"fmt"
	"time"
)

func main() {
	Start := "2024-08-07 14:15:13"
	End := "2024-08-08 14:15:13"
	Layout := "2006-01-02 15:04:05" // 格式

	locationName := "Asia/Shanghai"

	// 根据时区名称加载时区
	location, err := time.LoadLocation(locationName)
	if err != nil {
		fmt.Println("时区加载失败:", err)
		return
	}

	StartTime, err := time.ParseInLocation(Layout, Start, location)
	if err != nil {
		return
	}
	EndTime, err := time.ParseInLocation(Layout, End, location)
	if err != nil {
		return
	}
	duration := EndTime.Sub(StartTime)
	Hours := uint(duration.Hours())
	// 获取Unix时间戳(秒)
	Startstamp := StartTime.Unix()
	Endstamp := EndTime.Unix()
	msg := fmt.Sprintf("hours: %d, start: %d, end: %d", Hours, Startstamp, Endstamp)
	print(msg)
}

结果: hours: 24, start: 1723011313, end: 1723097713
相关推荐
weixin_440784116 小时前
【HandlerThread实现原理】
android·java·开发语言
天空'之城6 小时前
C 语言工业级通用组件手写 24:互补滤波
c语言·开发语言·互补滤波·嵌入式算法·工业级组件
有梦不弃6 小时前
模块化单体架构设计方案:DDD + 六边形架构落地实践
后端·架构
XR1234567886 小时前
工厂车间无线网络方案对比:AGV漫游哪家强?
开发语言·php
傻啦嘿哟7 小时前
某短视频平台视频爬虫实战:抓取推荐流视频信息,绕过反爬的3种技巧
开发语言·爬虫·python
現実君7 小时前
【硬件进阶】AD22上位替换JLEDA教程
开发语言·php
mubei-1237 小时前
SpringDAO的用法
java·开发语言·数据库
格林威10 小时前
多相机微秒级对齐:硬件触发 vs PTP(IEEE 1588)方案实战对比
开发语言·人工智能·数码相机·机器学习·计算机视觉·视觉检测·机器视觉
江南十四行10 小时前
Spring框架核心(上)——IoC控制反转与DI依赖注入详解
java·后端·spring
IT_陈寒11 小时前
Redis缓存击穿把我坑惨了,原来这样设过期时间才靠谱
前端·人工智能·后端