Uzyskiwanie uniksowego znacznika czasu w języku Go (aktualny czas w sekundach od epoki)

88

Mam kod napisany w Go, który próbuję zaktualizować, aby działał z najnowszymi cotygodniowymi kompilacjami. (Ostatnio zbudowano go pod r60). Wszystko działa teraz z wyjątkiem następującego bitu:

 if t, _, err := os.Time(); err == nil {
   port[5] = int32(t)
 }

Jakieś porady, jak zaktualizować to, aby działało z obecną implementacją Go?

crc
źródło

Odpowiedzi:

171
import "time"
...
port[5] = int32(time.Now().Unix())

źródło
44
ALERT: Wartość Unix()zwracana jest typu int64. Obcięcie int64wartości typu do type int32to przykład problemu z rokiem 2038 .
peterSO
1
go1.9.2 darwin / amd64 zwraca to konsekwentnie: 1969-12-31 19:00:00, co jest mniej więcej odpowiednikiem: time.Unix (0, 0). To jest bez obcięcia.
Breedly
32

Jeśli chcesz go stringpo prostu przekonwertować za pomocą strconv:

package main

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

func main() {
    timestamp := strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
    fmt.Println(timestamp) // prints: 1436773875771421417
}
Fatih Arslan
źródło
Jaki jest sens tego? Jeśli ktoś chce zamienić liczbę na łańcuch, może dowiedzieć się, jak to zrobić. A może powinienem po prostu dodać kolejną odpowiedź: jeśli chcesz przekonwertować go na bajtearray, po prostu wykonaj [] bajt (...)?
Salvador Dali
12
@SalvadorDali Właściwie to jest dokładnie to, czego potrzebowałem. Śmiało i dodaj swoją odpowiedź, aby przekonwertować ją na tablicę bajtów, jeśli chcesz. Jestem pewien, że w końcu ktoś przyjdzie i będzie potrzebował kodu.
anon58192932
3
time.Now (). UTC (). UnixNano () można zastąpić czasem.Now (). UnixNano () - dokument mówi, że wynik nie zależy od lokalizacji skojarzonej z t.
Abu Junayd,
16

Kolejna wskazówka. time.Now().UnixNano()(godoc) da ci nanosekundy od epoki. Nie jest to ściśle czas uniksowy, ale zapewnia precyzję poniżej sekundy przy użyciu tej samej epoki, co może być przydatne.

Edycja: Zmieniono, aby pasował do bieżącego interfejsu API golang

Nate
źródło
1
Wiem, że wskrzeszam stary wątek, ale zastanawiam się ... Python wyraźnie dokumentuje problemy z uzyskiwaniem dokładnego czasu na różnych platformach. Zobacz docs.python.org/2/library/time.html i wyszukaj „precyzję”. Chodzi o to, że to nie dlatego, że masz float64, że wszystkie cyfry dziesiętne są znaczące. W jaki sposób wdrażany jest czas Go, jak bardzo mogę ufać tej nanosekundowej precyzji?
Niriel
5
To nie działa tutaj, ale time.Now().UnixNano()( odniesienie ) tak.
Jo Liss
0

Opierając się na pomyśle z innej odpowiedzi tutaj, aby uzyskać interpretację czytelną dla człowieka, możesz użyć:

package main

import (
    "fmt"
    "time"
)

func main() {
    timestamp := time.Unix(time.Now().Unix(), 0)
    fmt.Printf("%v", timestamp) // prints: 2009-11-10 23:00:00 +0000 UTC
}

Wypróbuj w The Go Playground .

ivanbgd
źródło