Golang(Go语言)字符串转时间格式封装以及填坑

先看代码:

package main

import (
	"fmt"
	"time"
)

func main() {
	timeStr := "2021-05-21 00:00:00"
	utcTime, _ := time.Parse(time.DateTime, timeStr)
	fmt.Println(utcTime)
    fmt.Println(utcTime.Local())
}

执行结果:

从这里可以看出,字符串转换为时间的返回值一定是UTC时区的时间,如果再将时间转为本地时间,则会产生时差

所以在这里封装了一个函数,该函数直接返回计算好偏移之后的本地时间

package main

import (
	"fmt"
	"time"
)

func main() {
	timeStr := "2021-05-21 00:00:00"
	localTime, _ := StringToLocalTime(timeStr)
	fmt.Println(localTime)
	fmt.Println(localTime.UTC())
}

// StringToLocalTime 字符串转换为本地时间
func StringToLocalTime(timeStr string) (time.Time, error) {
	layouts := []string{
		time.Layout,
		time.RFC822,
		time.RFC822Z,
		time.RFC850,
		time.RFC1123,
		time.RFC1123Z,
		time.RFC3339,
		time.RFC3339Nano,
		time.Kitchen,
		time.Stamp,
		time.StampMilli,
		time.StampMicro,
		time.StampNano,
		time.DateTime,
		time.DateOnly,
		time.TimeOnly,
	}
	utcTime := time.Now()
	var err error
	for _, layout := range layouts {
		utcTime, err = time.Parse(layout, timeStr)
		if err == nil {
			break
		}
	}
	if err != nil {
		return utcTime, err
	}
	// 传入的字符串转换为时间后一定是UTC时区的
	// 需要加上时区的偏移量生成新的UTC时间
	// 再将新的UTC时间转换为本地时间的时间

	// 获取当前时刻
	now := time.Now()

	// 通过当前时刻获取时区的名称和偏移量(秒)
	_, offset := now.Zone()

	// 将偏移量转换为小时数,注意偏移量是以秒为单位的
	offsetHours := offset / 3600
	offsetHours = -offsetHours
	return utcTime.Add(time.Duration(offsetHours) * time.Hour).Local(), nil
}

这样就正常了

posted @ 2024-03-06 16:08  烟熏牛肉干  阅读(390)  评论(0编辑  收藏  举报