Comment analyser l'horodatage Unix en temps.

126

J'essaye d'analyser un horodatage Unix mais j'obtiens une erreur hors de portée. Cela n'a pas vraiment de sens pour moi, car la mise en page est correcte (comme dans la documentation Go):

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

Terrain de jeux

Hey
la source

Réponses:

239

La time.Parsefonction ne fait pas d'horodatages Unix. Au lieu de cela, vous pouvez utiliser strconv.ParseIntpour analyser la chaîne int64et créer l'horodatage avec 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)
}

Production:

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

Aire de jeu: http://play.golang.org/p/v_j6UIro7a

Éditer:

Changé de strconv.Atoià strconv.ParseIntpour éviter les débordements int sur les systèmes 32 bits.

ANisus
la source
1
Une idée de la raison pour laquelle il n'y a pas de telle référence dans les documents? Ils donnent même la disposition de timestap unix comme exemple de disposition.
hey
Je suppose que c'est parce qu'un horodatage unix ne nécessite pas d'analyse car ce n'est pas une représentation textuelle, mais plutôt une représentation entière du temps. Vous venez d'avoir une représentation sous forme de chaîne d'une valeur entière. Et la mention de 1136239445 dans la documentation est probablement juste pour clarifier quel horodatage exact doit être utilisé comme heure de référence, et non pas qu'il doit être utilisé comme mise en page.
ANisus
4
Ne serait-il pas préférable d'utiliser à la strconv.ParseUintplace car les nombres négatifs n'ont pas de sens de toute façon?
Atmocreations
6
@Atmocreations: func Unix(sec int64, nsec int64) Timereçoit des int64valeurs. De plus, les nombres négatifs pour sec ont un sens parfait - ils décrivent des dates antérieures à 1970! :) Pour ce nsecqui est des valeurs négatives, cela signifie supprimer autant de nanosecondes des secondes.
ANisus
1
Je veux seulement la date et l'heure comme "2014-07-16 20:55:46" comment cela pourrait-il être réalisé?
karthik
14

Vous pouvez utiliser directement time.Fonction Unix de l'heure qui convertit l'horodatage Unix en 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)
}

Production

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

Enregistrez-vous sur Go Playground: https://play.golang.org/p/5FtRdnkxAd

negi Yogi
la source
4

Partage de quelques fonctions que j'ai créées pour les dates:

Veuillez noter que je voulais obtenir l'heure pour un endroit particulier (pas seulement l'heure UTC). Si vous voulez l'heure UTC, supprimez simplement la variable loc et l'appel de la fonction .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
la source
Le retrait .In(loc)m'a donné du temps -0400 EDT. Le remplacer par .In(time.UTC)m'a donné du temps en UTC.
NatoBoram
3

Selon la documentation go , Unix renvoie une heure locale.

Unix renvoie l'heure locale correspondant à l'heure Unix donnée

Cela signifie que la sortie dépendra de la machine sur laquelle votre code s'exécute, ce qui, le plus souvent, est ce dont vous avez besoin, mais parfois, vous voudrez peut-être avoir la valeur en UTC.

Pour ce faire, j'ai adapté l' extrait de code pour qu'il renvoie une heure UTC:

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

Cela s'imprime sur ma machine (en CEST)

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

Je fais beaucoup de journalisation où les horodatages sont float64 et utilise cette fonction pour obtenir les horodatages sous forme de chaîne:

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
la source
-6

Utilisez simplement le temps.

exemple:

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

Exemple de travail sur play.golang.org .

okhrypko
la source
2
La question spécifie un horodatage unix. Cette réponse n'aborde pas cet aspect.
t3h2mas le