如何将unix时间戳解析为time.Time

时间:2014-07-28 00:45:59

标签: go time unix-timestamp

我正在尝试解析Unix timestamp,但是我超出了范围错误。这对我来说没有多大意义,因为布局是正确的(如Go文档中所示):

package main

import "fmt"
import "time"

func main() {
    tm, err := time.Parse("1136239445", "1405544146")
    if err != nil{
        panic(err)
    }

    fmt.Println(tm)
}

Playground

8 个答案:

答案 0 :(得分:152)

time.Parse函数不执行Unix时间戳。相反,您可以使用strconv.ParseInt将字符串解析为int64并使用time.Unix创建时间戳:

package main

import (
    "fmt"
    "time"
    "strconv"
)

func main() {
    i, err := strconv.ParseInt("1405544146", 10, 64)
    if err != nil {
        panic(err)
    }
    tm := time.Unix(i, 0)
    fmt.Println(tm)
}

<强>输出:

2014-07-16 20:55:46 +0000 UTC

游乐场: http://play.golang.org/p/v_j6UIro7a

修改

strconv.Atoi更改为strconv.ParseInt以避免32位系统上的int溢出。

答案 1 :(得分:7)

  

你可以直接使用time.Unix函数将unix时间戳转换成UTC

package main

import (
  "fmt"
  "time"
)


func main() {

unixTimeUTC:=time.Unix(1405544146, 0) //gives unix time stamp in utc 

unitTimeInRFC3339 :=unixTimeUTC.Format(time.RFC3339) // converts utc time to RFC3339 format

fmt.Println("unix time stamp in UTC :--->",unixTimeUTC)
fmt.Println("unix time stamp in unitTimeInRFC3339 format :->",unitTimeInRFC3339)

}

  

输出

unix time stamp in UTC :---> 2014-07-16 20:55:46 +0000 UTC
unix time stamp in unitTimeInRFC3339 format :----> 2014-07-16T20:55:46Z
  

检查Go Playground:https://play.golang.org/p/5FtRdnkxAd

答案 2 :(得分:3)

分享我为日期创建的一些功能:

请注意,我想为特定地点(而不仅仅是UTC时间)抽出时间。如果你想要UTC时间,只需删除loc变量和.In(loc)函数调用。

func GetTimeStamp() string {
     loc, _ := time.LoadLocation("America/Los_Angeles")
     t := time.Now().In(loc)
     return t.Format("20060102150405")
}
func GetTodaysDate() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("2006-01-02")
}

func GetTodaysDateTime() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("2006-01-02 15:04:05")
}

func GetTodaysDateTimeFormatted() string {
    loc, _ := time.LoadLocation("America/Los_Angeles")
    current_time := time.Now().In(loc)
    return current_time.Format("Jan 2, 2006 at 3:04 PM")
}

func GetTimeStampFromDate(dtformat string) string {
    form := "Jan 2, 2006 at 3:04 PM"
    t2, _ := time.Parse(form, dtformat)
    return t2.Format("20060102150405")
}

答案 3 :(得分:1)

我在时间戳记为float64的地方做了很多记录,并使用此函数将时间戳记作为字符串获取:

func dateFormat(layout string, d float64) string{
    intTime := int64(d)
    t := time.Unix(intTime, 0)
    if layout == "" {
        layout = "2006-01-02 15:04:05"
    }
    return t.Format(layout)
}

答案 4 :(得分:0)

检查此回购: https://github.com/araddon/dateparse

您可以使用

t, err := dateparse.ParseAny(timestampString)

答案 5 :(得分:0)

根据go documentation,Unix返回本地时间。

  

Unix返回与给定Unix时间相对应的本地时间

这意味着输出将取决于您的代码所运行的机器,这通常是您所需要的,但有时,您可能希望使用UTC中的值。

为此,我修改了snippet使其返回UTC时间:

i, err := strconv.ParseInt("1405544146", 10, 64)
if err != nil {
    panic(err)
}
tm := time.Unix(i, 0)
fmt.Println(tm.UTC())

这将在我的机器上打印(在CEST中)

2014-07-16 20:55:46 +0000 UTC

答案 6 :(得分:0)

这是一个老问题,但我注意到缺少一个实用的答案。

例如,我们正在使用 MavLink,我们需要处理此消息和 estructure definition is here

如果我们有这个数据结构:

<头>
字段名称 类型 单位 说明
time_boot_ms uint64_t 毫秒 时间戳(系统启动后的时间)。
press_abs 浮动 hPa 绝对压力
press_diff 浮动 hPa 压差1
温度 int16_t cdegC 绝压温度
温度压力差异** int16_t cdegC 压差温度(0,如果不可用)。将 0(或 1)的值报告为 1 cdegC。

我们不断获得更新,我们需要处理 time_boot_ms 以将其插入数据库并将其与其他消息同步。

我们能做什么?

正如我们所注意到的,时间以毫秒为单位,每个对 Go 有一定经验的人都知道,出于某种未知的原因,转换毫秒分辨率 Unix {{1} } 到 timestamp。内置的 time.Time 函数仅支持秒和纳秒精度。

我们如何获得毫秒精度?

好吧,我们可能会等到他们发布 Gotime.Unix() 版本,或者我们必须将毫秒乘以纳秒或将它们拆分为秒和纳秒。

让我们实现第二个想法,把它分成几秒和几纳秒:

1.7

现在我们可以将它封装在一个 unixUTCtime := time.Unix(ms/int64(1000), (ms%int64(1000))*int64(1000000)) 中并像这样在我们的 main 中使用它:

func

输出将是:

package main

import (
    "fmt"
    "time"
)

const msInSeconds = 1000
const nsInSeconds = 1000000

// UnixToMS Converts Unix Epoch from milliseconds to time.Time
func UnixToMS (ms int64) time.Time {
    return time.Unix(ms/int64(msInSeconds), (ms%int64(msInSeconds))*int64(nsInSeconds))
}

func main() {
    unixTimes := [...]int64{758991688, 758992188, 758992690, 758993186}
    var unixUTCTimes []time.Time

    for index, unixTime := range unixTimes {
        unixUTCTimes = append(unixUTCTimes, UnixToMS(unixTime))
        if index > 0 {
            timeDifference := unixUTCTimes[index].Sub(unixUTCTimes[index-1])
            fmt.Println("Time difference in ms :--->", timeDifference)
        }
    }
}

Check in Go Playground

答案 7 :(得分:-2)

只需使用time.Parse

即可

示例:

package main

import (
    "fmt"
    "time"
)

func main() {
    fromString := "Wed, 6 Sep 2017 10:43:01 +0300"
    t, e := time.Parse("Mon, _2 Jan 2006 15:04:05 -0700", fromString)
    if e != nil {
        fmt.Printf("err: %s\n", e)
    }
    fmt.Printf("UTC time: %v\n", t.UTC())
}

play.golang.org上的工作示例。