Unix zaman damgası zamana nasıl ayrıştırılır.


126

Bir Unix zaman damgasını ayrıştırmaya çalışıyorum ama aralık dışı hatası alıyorum. Bu bana pek mantıklı gelmiyor çünkü düzen doğru (Go belgelerinde olduğu gibi):

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

Oyun alanı

Yanıtlar:


239

time.ParseFonksiyonu Unix zaman damgalarını yapmaz. Bunun yerine strconv.ParseInt, dizeyi ayrıştırmak int64ve zaman damgasını şu şekilde oluşturmak için kullanabilirsiniz 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)
}

Çıktı:

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

Oyun alanı: http://play.golang.org/p/v_j6UIro7a

Düzenle:

32 bit sistemlerde int taşmalarını önlemek strconv.Atoiiçin strconv.ParseIntyerine olarak değiştirildi .


1
Belgelerde neden böyle bir referans bulunmadığına dair bir fikriniz var mı? Hatta bir düzen örneği olarak unix zaman damgası düzenini bile veriyorlar.
hey

Sanırım bunun nedeni, bir unix zaman damgasının, bir metin temsili değil, zamanın tamsayı temsili olduğu için ayrıştırmayı gerektirmemesidir. Bir tamsayı değerinin dize temsiline sahipsiniz. Ve belgelerde 1136239445'ten bahsedilmesi, muhtemelen sadece, mizanpaj olarak kullanılması için değil, referans zaman olarak hangi tam zaman damgasının kullanılacağını açıklığa kavuşturmak içindir.
ANisus

4
strconv.ParseUintNegatif sayılar zaten bir anlam ifade etmediği için kullanmak daha iyi olmaz mıydı?
Atmocreations

6
@Atmocreations: değerleri func Unix(sec int64, nsec int64) Timealır int64. Ayrıca, saniye için negatif sayılar mükemmel bir anlam ifade ediyor - 1970'den önceki tarihleri ​​tanımlarlar! :) nsecNegatif değerler ise o kadar nanosaniyeyi saniyelerden çıkarmak demektir.
ANisus

1
Sadece tarih ve saati "2014-07-16 20:55:46" olarak istiyorum nasıl başarılabilir?
karthik

14

Unix zaman damgasını UTC'ye çeviren time.Unix fonksiyonunu doğrudan kullanabilirsiniz.

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

Çıktı

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

Go Playground'a giriş yapın: https://play.golang.org/p/5FtRdnkxAd


4

Tarihler için oluşturduğum birkaç işlevi paylaşıyorum:

Lütfen belirli bir konum için zaman almak istediğimi unutmayın (yalnızca UTC saati değil). UTC saatini istiyorsanız, sadece loc değişkenini ve .In (loc) işlev çağrısını kaldırın.

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

Çıkarma .In(loc)bana zaman verdi -0400 EDT. Bunu ile değiştirmek .In(time.UTC)bana UTC olarak zaman verdi.
NatoBoram

3

Göre go belgelerinde , Unix bir yerel saat döndürür.

Unix, verilen Unix zamanına karşılık gelen yerel Saati döndürür

Bu, çıktının kodunuzun üzerinde çalıştığı makineye bağlı olacağı anlamına gelir; bu, çoğu zaman ihtiyacınız olan şeydir, ancak bazen değeri UTC olarak almak isteyebilirsiniz.

Bunu yapmak için, pasajı UTC'de bir zaman döndürmesi için uyarladım :

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

Bu, makinemde yazdırılıyor (CEST'de)

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

0

Zaman damgalarının float64 olduğu çok sayıda günlük kaydı yapıyorum ve bu işlevi zaman damgalarını dize olarak almak için kullanıyorum:

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

Sadece zamanı kullanın .

misal:

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

Play.golang.org'da çalışma örneği .


2
Soru, bir unix zaman damgasını belirtir. Bu cevap, bu yönü ele almıyor.
t3h2mas
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.