首页 > 其他分享 >Golang(Go语言)字符串转时间格式封装以及填坑

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

时间:2024-03-06 16:11:22浏览次数:40  
标签:00 err fmt timeStr utcTime Golang 填坑 time 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
}

这样就正常了

标签:00,err,fmt,timeStr,utcTime,Golang,填坑,time,Go
From: https://www.cnblogs.com/biltong/p/18056845

相关文章

  • Mac电脑彻底删除 JetBrains 、Idea、pycharm 、webstrom、goland
    首先删除app删除缓存新版本cdUsers/xxx/Library/rm-rfLogs/JetBrains/IntelliJIdea202x.xrm-rfPreferences/com.jetbrains.intellij.plistrm-rfPreferences/com.jetbrains.jbr.java.plistrm-rfPreferences/jetbrains.jetprofile.asset.plistrm-rfApplicat......
  • 应用监控 eBPF 版:实现 Golang 微服务的无侵入应用监控
    作者:古琦在现代软件架构中,微服务已成为构建可扩展和灵活应用程序的流行方式。每个微服务负责应用程序的一部分功能,它们共同工作以提供完整的服务。由于微服务架构的分散特性,监控变得至关重要,有效的微服务监控是确保高可用性、可靠性和服务质量的关键组成部分,它支撑了整个系统的健......
  • Dockerfile 部署uwsgi+nginx+django
    背景最近在和组内小伙伴一起写接口测试平台后端,使用的是drf框架,目前已经完成部分工作。在和前端联调试另一个小伙伴使用uwsgi部署起来了,我感觉这样部署很low,因为之前有了解过docker所以想着这一次彻底把docker给学会吧,于是就有了这篇文章。首先先看一下我的目录结构i......
  • GORM many2many、many2one、one2many关联表的操作
    一、简单介绍:当我们设计数据库时,经常会遇到实体之间的关系。这些关系通常可以分为三种类型:many-to-many(多对多)、many-to-one(多对一)和one-to-many(一对多)。Many-to-Many(多对多):意义:多对多关系表示一个实体可以与多个其他实体相关联,同时这些实体也可以与多个该实体相关......
  • JPEG algorithm
    目录简介简介JPEG算法首先将RGB源图像转换为YCbCr色彩空间(一个亮度分量(Y)和两个色度分量(Cb和Cr))(RGB图像模式与YCbCr彩色空间的关系见上一篇文章)大多数JPEG图像采用YCbCr4:2:0格式,其中Y保持相同的分辨率,而Cb和Cr分量被下采样为其原始分辨率的1/4接下来,将每个分量划......
  • Google multitask模型SNR
    背景MMoE模型从一定程度上解决了多个目标(任务)在训练过程中的相互耦合的问题,即使用门控概念(gatenetwork)降低了因为share-layer部分带来的“特征耦合”。但其实这是不够的,因为在每一个expert内部,与其他的expert不存在联系,这导致每个expert的表达能力不是“那么强”。因此google提......
  • 2024-03-06:用go语言,每一种货币都给定面值val[i],和拥有的数量cnt[i], 想知道目前拥有的
    2024-03-06:用go语言,每一种货币都给定面值val[i],和拥有的数量cnt[i],想知道目前拥有的货币,在钱数为1、2、3...m时,能找零成功的钱数有多少?也就是说当钱数的范围是1~m,返回这个范围上有多少可以找零成功的钱数。比如只有3元的货币,数量是5张,m=10。那么在1~10范围上,只有钱数是3、6......
  • golang标准库之 fmt
    目录fmt库1.获取输入(1)fmt.Scan(常用)(2)fmt.Scanln(常用)(3)fmt.Scanf2.print、println、printf输出3.Sprint(了解即可)4.Errorf(了解即可)5.格式化占位符(1)通用占位符(2)布尔型占位符(3)整型占位符(4)浮点数与复数占位符(5)字符串和[]byte占位符(6)指针占位符(7)宽度标识符(8)其他fmt库fmt包实现了......
  • golang标准库之 flag、strconv
    目录一、flag库1.flag的简单替代2.flag的参数类型3.flag参数的定义(1)flag.Type()(2)flag.TypeVar()4.flag解析命令行参数5.flag其他方法二、strconv库1.string转换为int类型2.int转换为string类型3.Parse系列函数(1)ParseBool()(2)ParseInt()(3)ParseUnit()(4)ParseFloat()(5)示例4.Fo......
  • golang标准库之 time
    目录time库1.时间类型2.时间戳(1)时间格式转化为时间戳(2)时间戳转换为时间格式3.时间间隔类型4.时间的操作(1)时间格式化(2)解析字符串类型的时间(3)时间加时间间隔(4)两个时间之差(5)时间是否相同(6)判断时间前后(7)定时器time库time库是Go语言内置的库,用来定义和操作时间、日期time.Sl......