Golang中int64转时间戳遇到问题如何解决
Golang中int64转时间戳遇到问题如何解决 我正在尝试从一个从URL下载的JSON字符串中的时间戳字段获取年份和月份。
例如:
package main
import (
"fmt"
"time"
)
func main() {
m1 := int64(1560207582311)
t1 := time.Unix(m1, 0)
m2 := int64(1532009163)
t2 := time.Unix(m2, 0)
fmt.Println(t1.Format("2006-01-02"))
fmt.Println(t2.Format("2006-01-02"))
}
但我得到的结果是: 51411-01-05 // m1 2018-07-19 // m2
m2是从网上的一个示例中获取的,它工作正常,但m1是从URL加载的JSON中获取的。
有什么提示吗?
更多关于Golang中int64转时间戳遇到问题如何解决的实战教程也可以访问 https://www.itying.com/category-94-b0.html
5 回复
是的!!! 我没有仔细阅读时间相关的文档…… 非常感谢!!!
fmt.Println(time.UnixMilli(1560207582311))
你遇到的问题是时间戳的单位不一致。m1 的时间戳是毫秒级(13位),而 time.Unix() 函数默认接收秒级时间戳(10位)。
解决方案:
方法1:将毫秒转换为秒
package main
import (
"fmt"
"time"
)
func main() {
m1 := int64(1560207582311)
// 将毫秒转换为秒
t1 := time.Unix(m1/1000, 0)
m2 := int64(1532009163)
t2 := time.Unix(m2, 0)
fmt.Println(t1.Format("2006-01-02")) // 2019-06-11
fmt.Println(t2.Format("2006-01-02")) // 2018-07-19
}
方法2:使用纳秒参数
package main
import (
"fmt"
"time"
)
func main() {
m1 := int64(1560207582311)
// 使用纳秒参数(毫秒 * 1e6)
t1 := time.Unix(0, m1*int64(time.Millisecond))
fmt.Println(t1.Format("2006-01-02")) // 2019-06-11
fmt.Println(t1.Year()) // 2019
fmt.Println(t1.Month()) // June
fmt.Println(int(t1.Month())) // 6
}
方法3:完整的JSON解析示例
package main
import (
"encoding/json"
"fmt"
"time"
)
type Data struct {
Timestamp int64 `json:"timestamp"`
}
func parseTimestamp(ts int64) time.Time {
// 判断是秒级还是毫秒级时间戳
if ts > 1e10 { // 如果大于10^10,很可能是毫秒级
return time.Unix(ts/1000, 0)
}
return time.Unix(ts, 0)
}
func main() {
jsonStr := `{"timestamp": 1560207582311}`
var data Data
json.Unmarshal([]byte(jsonStr), &data)
t := parseTimestamp(data.Timestamp)
fmt.Printf("年份: %d\n", t.Year()) // 2019
fmt.Printf("月份: %d\n", t.Month()) // June
fmt.Printf("月份数字: %d\n", int(t.Month())) // 6
fmt.Printf("完整日期: %s\n", t.Format("2006-01-02")) // 2019-06-11
}
方法4:使用辅助函数处理不同精度的时间戳
package main
import (
"fmt"
"time"
)
func UnixToTime(timestamp int64) time.Time {
// 13位:毫秒,10位:秒
switch {
case timestamp > 1e12: // 微秒级
return time.Unix(0, timestamp*1000)
case timestamp > 1e10: // 毫秒级
return time.Unix(timestamp/1000, (timestamp%1000)*int64(time.Millisecond))
default: // 秒级
return time.Unix(timestamp, 0)
}
}
func main() {
timestamps := []int64{
1560207582311, // 毫秒级
1532009163, // 秒级
1560207582311123, // 微秒级
}
for _, ts := range timestamps {
t := UnixToTime(ts)
fmt.Printf("时间戳: %d -> 日期: %s\n", ts, t.Format("2006-01-02 15:04:05"))
}
}
关键点:
- 时间戳单位:检查你的JSON时间戳是秒级(10位)还是毫秒级(13位)
- 转换方法:毫秒级时间戳需要除以1000转换为秒级
- 边界判断:可以通过时间戳的长度自动判断单位
你的m1是毫秒级时间戳(1560207582311),对应北京时间2019-06-11 16:59:42,使用正确的转换方法后就能得到正确结果。


