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 回复

谢谢!!!

更多关于Golang中int64转时间戳遇到问题如何解决的实战系列教程也可以访问 https://www.itying.com/category-94-b0.html


是的!!! 我没有仔细阅读时间相关的文档…… 非常感谢!!!

fmt.Println(time.UnixMilli(1560207582311))

从输入的数量级可以看出,m1 很可能是一个以毫秒为单位的时间戳,或者确实是一个距今 49000 年后的日期。

你遇到的问题是时间戳的单位不一致。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"))
    }
}

关键点:

  1. 时间戳单位:检查你的JSON时间戳是秒级(10位)还是毫秒级(13位)
  2. 转换方法:毫秒级时间戳需要除以1000转换为秒级
  3. 边界判断:可以通过时间戳的长度自动判断单位

你的m1是毫秒级时间戳(1560207582311),对应北京时间2019-06-11 16:59:42,使用正确的转换方法后就能得到正确结果。

回到顶部