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


126

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

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

操场

Answers:


239

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.Atoistrconv.ParseInt以避免int在32位系统上溢出。


1
知道为什么文档中没有这样的参考吗?他们甚至提供unix时间戳布局作为布局示例。

我猜这是因为unix时间戳不需要解析,因为它不是文本表示,而是时间的整数表示。您刚巧有一个整数值的字符串表示形式。在文档中提到1136239445可能只是为了澄清确切的时间戳记用作参考时间,而不是将其用作布局。
阿尼斯(Anisus)2014年

4
strconv.ParseUint改用负数不是更好吗?
Atmocreations

6
@Atmocreations:func Unix(sec int64, nsec int64) Time接收int64值。同样,秒的负数是很有意义的-它们描述了1970年之前的日期!:)至于nsec,负值意味着从秒中删除那么多纳秒。
阿尼斯(Anisus)

1
我只希望日期和时间为“ 2014-07-16 20:55:46”,如何实现?
karthik '16

14

您可以直接使用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


4

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

请注意,我想获取特定位置的时间(而不仅仅是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")
}

搬迁.In(loc)给了我时间-0400 EDT。替换为它.In(time.UTC)给了我UTC时间。
NatoBoram

3

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

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

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

为此,我修改了代码段以使其返回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

0

我在时间戳记为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)
}

-6

只需使用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上的工作示例。


2
该问题指定了unix时间戳。这个答案没有解决这个问题。
t3h2mas '18
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.