Como analisar o registro de data e hora unix para time.Time

126

Estou tentando analisar um carimbo de data / hora Unix e mas recebo um erro fora do intervalo. Isso realmente não faz sentido para mim, porque o layout está correto (como nos documentos do Go):

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

Parque infantil

Ei
fonte

Respostas:

239

A time.Parsefunção não faz registros de data e hora do Unix. Em vez disso, você pode usar strconv.ParseIntpara analisar a sequência int64e criar o registro de data e hora com 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)
}

Resultado:

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

Playground: http://play.golang.org/p/v_j6UIro7a

Editar:

Alterado de strconv.Atoipara strconv.ParseIntpara evitar transbordamentos int em sistemas de 32 bits.

ANisus
fonte
1
Alguma idéia de por que não existe tal referência nos documentos? Eles ainda fornecem o layout de timestap unix como um exemplo de layout.
hey
Eu acho que é porque um timestamp unix não está exigindo análise, pois não é uma representação de texto, mas uma representação inteira de tempo. Você acabou de ter uma representação de seqüência de caracteres de um valor inteiro. E a menção de 1136239445 nos documentos provavelmente é apenas para esclarecer qual carimbo de data e hora exato deve ser usado como tempo de referência, e não que ele deve ser usado como layout.
ANisus
4
Não seria melhor usar, strconv.ParseUintpois os números negativos não fazem sentido, afinal?
Atmocreations
6
@Atmocreations: func Unix(sec int64, nsec int64) Timerecebe int64valores. Além disso, números negativos por segundo fazem todo o sentido - eles descrevem datas anteriores a 1970! :) Quanto a nsecvalores negativos, significa remover tantos nanossegundos dos segundos.
ANisus
1
Quero apenas a data e a hora como "2014-07-16 20:55:46" como isso pode ser alcançado?
Karthik
14

Você pode usar diretamente a função time.Unix de hora que converte o carimbo de hora unix em 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)
}

Resultado

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

Check-in Go Playground: https://play.golang.org/p/5FtRdnkxAd

negi Yogi
fonte
4

Compartilhando algumas funções que eu criei para datas:

Observe que eu queria obter tempo para um local específico (não apenas o horário UTC). Se você quiser a hora UTC, basta remover a variável loc e a chamada de função .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")
}
Adi
fonte
Remover .In(loc)me deu tempo -0400 EDT. Substituí-lo por .In(time.UTC)deu-me tempo no UTC.
NatoBoram 16/07/19
3

De acordo com a documentação do Go , o Unix retorna um horário local.

O Unix retorna a hora local correspondente à hora do Unix fornecida

Isso significa que a saída dependerá da máquina em que seu código é executado, o que, na maioria das vezes, é o que você precisa, mas às vezes você pode querer ter o valor em UTC.

Para fazer isso, adaptei o snippet para retornar um horário no UTC:

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

Isso imprime na minha máquina (em CEST)

2014-07-16 20:55:46 +0000 UTC
Thib-o
fonte
0

Faço muitos registros em que os carimbos de data / hora são float64 e uso essa função para obter os carimbos de data / hora como string:

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)
}
Saxasmu
fonte
-6

Basta usar o tempo.

exemplo:

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())
}

Exemplo de trabalho em play.golang.org .

okhrypko
fonte
2
A pergunta especifica um carimbo de data / hora unix. Esta resposta não aborda esse aspecto.
T3h2mas