Cómo analizar la marca de tiempo de Unix a time.Time

126

Estoy tratando de analizar una marca de tiempo de Unix pero obtengo un error fuera de rango. Eso realmente no tiene sentido para mí, porque el diseño es correcto (como en los documentos de Go):

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

Patio de recreo

Oye
fuente

Respuestas:

239

La time.Parsefunción no hace marcas de tiempo de Unix. En su lugar, puede usar strconv.ParseIntpara analizar la cadena int64y crear la marca de tiempo con 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)
}

Salida:

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

Zona de juegos: http://play.golang.org/p/v_j6UIro7a

Editar:

Se cambió de strconv.Atoia strconv.ParseIntpara evitar desbordamientos de int en sistemas de 32 bits.

ANiso
fuente
1
¿Alguna idea de por qué no hay tal referencia en los documentos? Incluso dan el diseño de la marca de tiempo de Unix como ejemplo de diseño.
hola
Supongo que se debe a que una marca de tiempo de Unix no requiere análisis, ya que no es una representación de texto, sino más bien una representación entera de tiempo. Acaba de tener una representación de cadena de un valor entero. Y la mención de 1136239445 en los documentos es probablemente solo para aclarar qué marca de tiempo exacta se usará como tiempo de referencia, no para usar como diseño.
ANiso
4
¿No sería mejor usarlos strconv.ParseUinten su lugar, ya que los números negativos no tienen sentido de todos modos?
Atmocreations
6
@Atmocreations: func Unix(sec int64, nsec int64) Timerecibe int64valores. Además, los números negativos por segundos tienen mucho sentido: ¡describen fechas anteriores a 1970! :) En cuanto a nseclos valores negativos, significa eliminar esa cantidad de nanosegundos de los segundos.
ANisus
1
Solo quiero la fecha y la hora como "2014-07-16 20:55:46", ¿cómo podría lograrse?
karthik
14

Puede usar directamente time.Unix función de tiempo que convierte el sello de tiempo de Unix a 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)
}

Salida

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

Regístrese en Go Playground: https://play.golang.org/p/5FtRdnkxAd

negi yogui
fuente
4

Compartiendo algunas funciones que creé para las fechas:

Tenga en cuenta que quería obtener la hora de una ubicación en particular (no solo la hora UTC). Si desea la hora UTC, simplemente elimine la variable loc y la función .In (loc) llamada.

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
fuente
Quitarme .In(loc)me dio tiempo -0400 EDT. Reemplazarlo con .In(time.UTC)me dio tiempo en UTC.
NatoBoram
3

Según la documentación de go , Unix devuelve una hora local.

Unix devuelve la hora local correspondiente a la hora Unix dada

Esto significa que la salida dependerá de la máquina en la que se ejecute su código, que, en la mayoría de los casos, es lo que necesita, pero a veces, es posible que desee tener el valor en UTC.

Para hacerlo, adapté el fragmento para que devuelva una hora en UTC:

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

Esto se imprime en mi máquina (en CEST)

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

Hago muchos registros donde las marcas de tiempo son float64 y uso esta función para obtener las marcas de tiempo como una cadena:

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
fuente
-6

Solo usa el tiempo.

ejemplo:

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

Ejemplo de trabajo en play.golang.org .

okhrypko
fuente
2
La pregunta especifica una marca de tiempo de Unix. Esta respuesta no aborda ese aspecto.
t3h2mas