Pobrać aktualny czas jako sformatowany ciąg w Go?

134

Jaki jest najlepszy sposób uzyskania aktualnego znacznika czasu w Go i przekonwertowania go na ciąg? Potrzebuję zarówno daty, jak i godziny np. Format RRRRMMDDggmmss.

brianoh
źródło
1
To wszystko, czego potrzebujesz golangprograms.com/…
Eduardo A. Fernández Díaz

Odpowiedzi:

152

Użyj time.Now()funkcji i time.Format()metody.

t := time.Now()
fmt.Println(t.Format("20060102150405"))

drukuje 20110504111515, a przynajmniej kilka minut temu. (Jestem na wschodnim czasie letnim). Istnieje kilka predefiniowanych formatów czasu w stałych zdefiniowanych w pakiecie czasu.

Możesz użyć, time.Now().UTC()jeśli wolisz czas UTC niż lokalną strefę czasową.

nmichaels
źródło
16
Zdecydowanie podoba mi się Kitchenstała ( = "3:04PM")
tux21b
5
Dzięki za te informacje. Skąd pakiet czasu wie po przekazaniu "20060102150405", po prostu co mijamy, skoro nie jest to jedna z predefiniowanych stałych w pakiecie czasu? Jakie znaczenie ma ta data i godzina w pakiecie czasu (20060102150405)? Wydaje mi się to trochę dziwaczne, ale przypuszczam, że dopóki działa, nie ma to znaczenia, o ile nie popełnimy błędu podczas kodowania. Wydaje mi się, że nie uznali za stosowne dostarczenia stałej dla tego formatu i dopasowania wzorca ciągu.
brianoh
9
@brianoh: patrz golang.org/pkg/time/#Constants Nadszedł czas „01/02 03:04:05 PM '06 -0700” Ponieważ każdy składnik ma inny numer (1, 2, 3 itd.), na podstawie liczb może określić, jakie składniki chcesz.
newacct
1
Zwróć uwagę, że time.LocalTime () już nie istnieje: zobacz moją odpowiedź poniżej, aby była kompatybilna z Go 1.0.3
Deleplace
71

Wszystkie inne odpowiedzi są bardzo chybione dla kogoś, kto pochodzi z Google i szuka „sygnatury czasowej w go”! RRRRMMDDhhmmss nie jest „datownikiem”.

Aby uzyskać „znacznik czasu” daty w ruchu (liczbę sekund od stycznia 1970 r.), Poprawna funkcja to .Unix () , która w rzeczywistości zwraca liczbę całkowitą

Bactisme
źródło
8
Zgadzam się; pytanie powinno być zatytułowane „aktualna data”, a nie „aktualna sygnatura czasowa”
developerbmw
1
Chociaż jest późno, myślę, że .Unix () powinno wskazywać na golang.org/pkg/time/#Time.Unix, którego typem zwracanym jest int64.
bornfree
Chociaż technicznie jesteście poprawni, myślę, że wielu programistów w dzisiejszych czasach łączy znacznik czasu z „Bieżącym czasem w jakiś sformatowany sposób”, więc ten tytuł byłby równie zagmatwany dla większości.
Roger Hill
Zaproponowałem edycję - Get current time as formatted string in Go?. Miejmy nadzieję, że ktoś to zaakceptuje.
akki
57

Dla czytelności najlepiej używać stałych RFC w pakiecie czasu (tak myślę)

import "fmt" 
import "time"

func main() {
    fmt.Println(time.Now().Format(time.RFC850))
}
matthewmcneely
źródło
4
Jak to tworzy RRRRMMDDhhmmss?
Rod
2
RFC850 produkuje Tuesday, 10-Nov-09 23:00:00 UTC RFC3339 = "2006-01-02T15:04:05Z07:00" play.golang.org/p/XmobwWSz5pN golang.org/pkg/time
Chris McKee
33

Użyj funkcji time.Now () i time.Format () (ponieważ time.LocalTime () nie istnieje już od Go 1.0.3)

t := time.Now()
fmt.Println(t.Format("20060102150405"))

Demo online (z datą ustaloną w przeszłości na placu zabaw, nieważne)

Deleplace
źródło
6
Możesz użyć tego po prostu jako ciągu, takiego jak ten:s := "Actual time is: "+time.Now().String()
Michael
2

Jako echo odpowiedzi @ Bactisme, sposób pobierania aktualnego znacznika czasu (na przykład w milisekundach) jest następujący:

msec := time.Now().UnixNano() / 1000000

Zasób: https://gobyexample.com/epoch

Jack Ryan
źródło
0

https://golang.org/src/time/format.go określony Do analizy czas 15jest używany do godzin, 04jest używany do minut, 05do sekund.

Do parsowania Data 11, Jan, Januaryto przez kilka miesięcy, 02, Mon, Mondaydla dnia miesiąca, 2006za rok i oczywiścieMST dla strefy

Ale możesz również użyć tego układu, który uważam za bardzo prosty. "Mon Jan 2 15:04:05 MST 2006"

    const layout = "Mon Jan 2 15:04:05 MST 2006"
    userTimeString := "Fri Dec 6 13:05:05 CET 2019"

    t, _ := time.Parse(layout, userTimeString)
    fmt.Println("Server: ", t.Format(time.RFC850))
    //Server:  Friday, 06-Dec-19 13:05:05 CET

    mumbai, _ := time.LoadLocation("Asia/Kolkata")
    mumbaiTime := t.In(mumbai)
    fmt.Println("Mumbai: ", mumbaiTime.Format(time.RFC850))
    //Mumbai:  Friday, 06-Dec-19 18:35:05 IST

PRÓBNY

STAL
źródło
-4

Aby odpowiedzieć dokładnie na pytanie:

import "github.com/golang/protobuf/ptypes"

Timestamp, _ = ptypes.TimestampProto(time.Now())
suran
źródło
Dzięki Suran, jest to przydatne, gdy trzeba wysłać znacznik czasu przez grpc
rajeshk