go语言设置时间区域 golang时间格式
为什么go语言时间格式化这么变态
是说 20060102150405 这个吗,原因大致如下:
创新互联专注于潮安企业网站建设,响应式网站,商城网站定制开发。潮安网站建设公司,为潮安等地区提供建站服务。全流程专业公司,专业设计,全程项目跟踪,创新互联专业和态度为您提供的服务
可读性高,所见即所得
实现简单,排除二义性(15或3代表时,4代表分,5代表秒,06或2006代表年)
请参考源代码:
187 case '3':
188 return layout[0:i], stdHour12, layout[i+1:]
189
190 case '4':
191 return layout[0:i], stdMinute, layout[i+1:]
192
193 case '5':
194 return layout[0:i], stdSecond, layout[i+1:]
195
gochannel过期时间
Go语言中的go-channel是一种很常用的并发通信方式,通过它可以实现协程之间的数据传输与同步,常常用于协程池、事件驱动、生产者-消费者模式等场景。
在Go语言中,go-channel并不支持设置过期时间,即无法直接通过给channel设置一个过期时间来控制其失效。但是可以通过其他技巧来达到类似的效果。
一种常用的技巧是在channel中传递一个结构体,该结构体中包含一个数据字段和一个time.Time类型的字段,表示数据产生的时间。在读取channel数据时,可以判断数据产生的时间是否已经过期,如果过期就直接丢弃该数据。
例如:
```go
type Data struct {
Value interface{}
ExpireAt time.Time // 数据失效时间
}
ch := make(chan Data)
// 数据写入通道,限制数据有效期10秒钟
go func() {
data := Data{Value: "hello", ExpireAt: time.Now().Add(10 * time.Second)}
ch - data
}()
// 读取通道数据
// 如果当前时间已经超过数据的失效时间,就直接丢弃该数据
// 否则就输出该数据
for {
select {
case data := -ch:
if time.Now().After(data.ExpireAt) {
continue // 已经过期,丢弃该数据
}
fmt.Println(data.Value) // 输出数据
}
}
```
这种方式虽然不是直接控制channel的过期时间,但通过控制传递的数据来达到类似的效果,是一种常用的解决方案。同时需要注意的是,如果通道中的元素被垃圾回收器所移除,那么可能被只包含指针的数据结构的通道就成为了正常的空闲物理内存的一部分,通道的元素也就永远无法失效了。因此在需要实现具有失效时间特性的通道时,需要特别注意内存管理问题。
Go时区设置
全球以英国伦敦格林威治作为零度经线的起点,每隔15经度为一个时区,15度经线为该时区的中央经线,共分为24个时区。由西向东每隔15经度增加一个时区,相反的,每向西15经度减少一个时区。中国所在时区为东8区。
当前时间 time.Now() 返回的是当地时区的时间:
CST可以代表如下四个不同的时区:
time.Now() 返回的 +0800 CST 表示的就是中国标准时间,与UTC时间有如下的转化:
Wall Clocks表示挂钟时间,存储的是自1970 年 1 月 1 日 0 时 0 分 0 秒以来的时间戳,当系统和授时服务器进行校准时间时间操作时,有可能造成这一秒是2018-1-1 00:00:00,而下一秒变成了2017-12-31 23:59:59的情况。
Monotonic Clocks,意思是单调时间的,所谓单调,就是只会不停的往前增长,不受校时操作的影响,这个时间是自进程启动以来的秒数。
time.Now() 返回的 m=+0.004002201 就是表示Monotonic Clocks
go语言中如果不设置指定的时区,通过 time.Now() 获取到的就是本地时区
设置时区有两种方式:
固定时区到东八区。但这种不是对程序的全局设置,每次获取时都需要固定时区
加载指定时区。但如果没有go环境使用这种方式就会加载失败,因为时区信息是放在go的安装包中的。
如果你用第二种方式加载时区,在打docker镜像时就需要进行时区相关的配置,配置文件如下:
参考文章:
网站标题:go语言设置时间区域 golang时间格式
文章源于:http://scyanting.com/article/ddsodes.html