Cara mengurai stempel waktu unix ke time.Time


126

Saya mencoba mengurai stempel waktu Unix tetapi saya mendapatkan kesalahan di luar jangkauan. Itu tidak masuk akal bagi saya, karena tata letaknya benar (seperti dalam dokumen Go):

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

Tempat bermain

Jawaban:


239

The time.ParseFungsi tidak melakukan Unix cap waktu. Sebagai gantinya, Anda dapat menggunakan strconv.ParseIntuntuk mengurai string menjadi int64dan membuat stempel waktu dengan 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)
}

Keluaran:

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

Taman bermain: http://play.golang.org/p/v_j6UIro7a

Edit:

Diubah dari strconv.Atoimenjadi strconv.ParseIntuntuk menghindari int overflows pada sistem 32 bit.


1
Tahu mengapa tidak ada referensi seperti itu di dokumen? Mereka bahkan memberikan tata letak peta waktu unix sebagai contoh tata letak.
hei

Saya kira itu karena stempel waktu unix tidak memerlukan parsing karena ini bukan representasi teks, melainkan representasi waktu integer. Anda baru saja memiliki representasi string dari nilai integer. Dan penyebutan 1136239445 di dokumen mungkin hanya untuk memperjelas stempel waktu persis apa yang akan digunakan sebagai waktu referensi, bukan untuk digunakan sebagai tata letak.
ANisus

4
Bukankah lebih baik menggunakan strconv.ParseUintsebagai gantinya karena angka negatif tidak masuk akal?
Atmocreations

6
@Atmocreations: func Unix(sec int64, nsec int64) Timemenerima int64nilai. Selain itu, angka negatif untuk detik sangat masuk akal - angka tersebut menjelaskan tanggal sebelum tahun 1970! :) Adapun nsec, nilai negatif berarti menghilangkan banyak nanodetik dari detik.
ANisus

1
Saya hanya ingin tanggal dan waktu sebagai "2014-07-16 20:55:46" bagaimana itu bisa tercapai?
karthik

14

Anda dapat langsung menggunakan fungsi time.Unix dari waktu yang mengubah stempel waktu unix menjadi 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)
}

Keluaran

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

Periksa di Go Playground: https://play.golang.org/p/5FtRdnkxAd


4

Berbagi beberapa fungsi yang saya buat untuk tanggal:

Harap dicatat bahwa saya ingin mendapatkan waktu untuk lokasi tertentu (bukan hanya waktu UTC). Jika Anda menginginkan waktu UTC, hapus saja variabel loc dan pemanggilan fungsi .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")
}

Menghapus .In(loc)memberi saya waktu -0400 EDT. Menggantinya dengan .In(time.UTC)memberi saya waktu di UTC.
NatoBoram

3

Menurut dokumentasi go , Unix mengembalikan waktu lokal.

Unix mengembalikan Waktu lokal yang sesuai dengan waktu Unix yang diberikan

Artinya, keluarannya akan bergantung pada mesin tempat kode Anda berjalan, yang paling sering Anda butuhkan, tetapi terkadang, Anda mungkin ingin memiliki nilai dalam UTC.

Untuk melakukannya, saya menyesuaikan cuplikan agar mengembalikan waktu dalam UTC:

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

Ini mencetak di mesin saya (di CEST)

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

0

Saya melakukan banyak pencatatan di mana cap waktu adalah float64 dan menggunakan fungsi ini untuk mendapatkan cap waktu sebagai 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)
}

-6

Gunakan saja time.Parse

contoh:

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

Contoh kerja di play.golang.org .


2
Pertanyaan tersebut menentukan stempel waktu unix. Jawaban ini tidak membahas aspek itu.
t3h2mas
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.