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
相关推荐
小鸡脚来咯19 小时前
一个Java的main方法在JVM中的执行流程
java·开发语言·jvm
江团1io019 小时前
深入解析三色标记算法
java·开发语言·jvm
天天摸鱼的java工程师20 小时前
RestTemplate 如何优化连接池?—— 八年 Java 开发的踩坑与优化指南
java·后端
一乐小哥20 小时前
一口气同步10年豆瓣记录———豆瓣书影音同步 Notion分享 🚀
后端·python
m0_7381207220 小时前
CTFshow系列——PHP特性Web97-100
开发语言·安全·web安全·php·ctfshow
LSTM9720 小时前
如何使用C#实现Excel和CSV互转:基于Spire.XLS for .NET的专业指南
后端
你我约定有三20 小时前
java--泛型
java·开发语言·windows
三十_20 小时前
【NestJS】构建可复用的数据存储模块 - 动态模块
前端·后端·nestjs
武子康20 小时前
大数据-91 Spark广播变量:高效共享只读数据的最佳实践 RDD+Scala编程
大数据·后端·spark
努力的小郑20 小时前
MySQL索引(二):覆盖索引、最左前缀原则与索引下推详解
后端·mysql