Golang Go语言时间格式化问题

Golang Go语言时间格式化问题

数据库用的 postgresql,字段类型为:TIMESTAMP

因为这一列的值可能存在null所以在 scan 的时候这一列的变量类型定义为:sql.NullString,这样最后如果有值的话得到的数据为这样的格式:"xxxx-xx-xxTxx:xx:xxZ"

这样会报错:time.Parse("layout", "xxxx-xx-xxTxx:xx:xxZ")

写时间 v 站就要让验证手机号:所以上面的时间和 layout 没写具体的值


更多关于Golang Go语言时间格式化问题的实战教程也可以访问 https://www.itying.com/category-94-b0.html

24 回复

每个字都看懂了,但是我没看懂你在问啥

更多关于Golang Go语言时间格式化问题的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


刚才一直在编辑主题,里面不知道里面哪个时间写的不对,v 站一直让验证手机

想把这个直接格式化成北京时间

没有指定时间格式的转换成时间戳的参数么

我也刚接触 go 不久,官方的time包找了下好像是没有。 第三方的不清楚有没有。

我猜你要找的是 strptime,不知道 go 有没有

解决了,是前面 layout 不对。我 layout 用的 xxxx-xx-xx xx:xx:xx,这里需要用 xxxx-xx-xxTxx:xx:xxZ

用 SQL 表达式 extract(epoch from xxx)::bigint 就可以返回时间戳,不用在 go 代码里解析

数据库返回的不一定是 “xxxx-xx-xxTxx:xx:xxZ” 格式。默认应该是 ISO 格式的,你这里不知道是哪里转换成了 ISO 8601 格式。你要确定数据库和程序库会一直输出 ISO 8601 格式才行,不然以后可能会出错。

没错,go 从数据库读出来的时间显示格式就是 tz 格式,很恶心,要自己 parse 再 format 成 datetime 格式

不过我建议你字段类型直接设置成 *time.Time,不用字符串,省了再去 parse

标准时间格式怎么恶心了 https://zh.wikipedia.org/wiki/ISO_8601
本应该只在呈现的地方格式化

变量类型是 time.Time 没问题。问题是 string 类型的,为什么要转成这种格式呢? mysql 的 timestamp 模式显示格式不是 yyyy-mm-dd hh:ii:ss 吗?

问题不应该是 time.Parse 不能用这个值反格式化吗

不是转成这种格式,是默认应该是这种格式

楼主已经讲了,自己的 layout 格式不匹配

time.RFC3339

变量类型设置成 time.Time 的话,如果某一个值为 null 的时候 scan 会报错的。




对的。layout 用 time.RFC3339 就 ok 了

不过结果最后会多一个 +0000 UTC,还得 Format 一次…

"用 SQL 表达式 extract(epoch from xxx)::bigint 就可以返回时间戳,不用在 go 代码里解析"

这个对数据库的效率会有影响吗?会不会影响数据库性能呢?

这肯定是 layout 有问题啊……

2006-01-02T13:04:05Z

不会。你现在拿到的字符串一样是转换出来的结果。

好的。谢谢

在Go语言中,处理时间格式化和解析是一个常见的需求,Go标准库提供了强大的time包来支持这些操作。

Go语言中的时间格式化依赖于一个特定的时间格式字符串,该字符串指定了时间的各个部分应该如何被格式化和解析。格式字符串的参考时间是Mon Jan 2 15:04:05 MST 2006,这个时间是固定的,用于记忆格式字符串的各部分顺序。例如,2006-01-02 15:04:05这个格式字符串表示年-月-日 时:分:秒的格式。

要格式化一个时间对象,可以使用Time类型的Format方法。例如:

package main

import (
    "fmt"
    "time"
)

func main() {
    now := time.Now()
    formattedTime := now.Format("2006-01-02 15:04:05")
    fmt.Println(formattedTime)
}

要解析一个字符串为时间对象,可以使用time.Parsetime.ParseInLocation函数,传入格式字符串和待解析的时间字符串。例如:

parsedTime, err := time.Parse("2006-01-02 15:04:05", "2023-10-05 12:34:56")
if err != nil {
    fmt.Println("Error parsing time:", err)
} else {
    fmt.Println(parsedTime)
}

掌握这些基本操作后,你就可以在Go程序中灵活地处理和格式化时间了。

回到顶部