后台开发中的时区问题

时区问题需要考虑几个因素,操作系统时区环境,代码时区,数据库时区

操作系统时区

通常操作系统根据 /etc/localtime 确定时区。对于东八区此文件一般可以从 /usr/share/zoneinfo/Asia/Shanghai 拷贝出来,或者链接到此文件。

/etc/localtime 文件可以确定时区的原因在于:

  • 时区数据:/etc/localtime 链接到的文件包含了该系统所在时区的具体信息,如相对于UTC的偏移量、夏令时规则等。
  • 系统时间设置:操作系统使用这个文件来确定系统时间、日期和相关的时间设置。当系统需要显示或处理时间时,它会参考这个文件中的时区信息来转换为本地时间。
  • 应用程序兼容性:许多应用程序在处理时间时会依赖 /etc/localtime 文件来确保它们显示和存储的时间是正确的,符合用户的本地时区设置。

代码时区(以 golang 为例子)

在解析时间,格式化时间时,可以指定时区,从而使时间带有时区信息

import (
	"fmt"
	"testing"
	"time"
)

func TestTimeConvert(t *testing.T) {
	// 原始时间字符串,带有 +08:00 时区偏移
	timeStr := "2020-01-01T21:30:03+02:00"

	// 定义时间的布局,这个布局与 RFC 3339 标准一致
	layout := time.RFC3339

	// 解析原始时间字符串为 time.Time 对象
	parsedTime, err := time.ParseInLocation(layout, timeStr, time.UTC)
	if err != nil {
		fmt.Println("Error parsing time:", err)
		return
	}

	// 打印 UTC 时间
	fmt.Println("time:", parsedTime) 
	fmt.Println("RFC3339 format  time:", parsedTime.Format(layout))
	fmt.Println("RFC3339 format in UTC time:", parsedTime.In(time.UTC).Format(layout))

	fmt.Println("DateTime format time:", parsedTime.Format(time.DateTime))
	fmt.Println("DateTime format in UTC time:", parsedTime.In(time.UTC).Format(time.DateTime))

运行结果

time: 2020-01-01 21:30:03 +0200 +0200
RFC3339 format time: 2020-01-01T21:30:03+02:00
RFC3339 format in UTC time: 2020-01-01T19:30:03Z
DateTime format time: 2020-01-01 21:30:03
DateTime format in UTC time: 2020-01-01 19:30:03

数据库时区

数据库有库的默认时区,是启动整个数据库时候指定的时区,对于 current timestamp 自动填充的,或者系统表的数据的时区都是依据数据库时区填充的。
session 时区,在 dbsource 指定的时区,可以指定 local,或者具体的时区,对于 gorm 可以参考下面的例子。

xxx?charset=utf8mb4&parseTime=true&loc=UTC"
?charset=utf8mb4&parseTime=true&loc=Local"
?charset=utf8mb4&parseTime=true&loc=Asia%2FShanghai

时区字段大小写对不上可能报错

  • 4
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值