Как да анализирате времевия печат на unix до time.Time

Опитвам се да анализирам Unix timestamp, но получавам грешка извън обхвата. Това наистина няма смисъл за мен, защото оформлението е правилно (както в Go документите):

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

Playground


person hey    schedule 28.07.2014    source източник


Отговори (5)


Функцията time.Parse не прави Unix времеви отпечатъци. Вместо това можете да използвате strconv.ParseInt, за да анализирате низа до int64 и да създадете клеймото за време с 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)
}

Изход:

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

Игра: http://play.golang.org/p/v_j6UIro7a

Редактиране:

Променено от strconv.Atoi на strconv.ParseInt, за да се избегнат препълвания на int на 32-битови системи.

person ANisus    schedule 28.07.2014
comment
Някаква идея защо няма такава препратка в документите? Те дори дават оформлението на unix timestap като пример за оформление. - person hey; 28.07.2014
comment
Предполагам, че е така, защото unix timestamp не изисква анализ, тъй като не е текстово представяне, а по-скоро цяло число на времето. Току-що сте имали низово представяне на цяло число. И споменаването на 1136239445 в документите вероятно е само за да се изясни кое точно време трябва да се използва като референтно време, а не че трябва да се използва като оформление. - person ANisus; 28.07.2014
comment
Не би ли било по-добре да използвате strconv.ParseUint вместо това, тъй като отрицателните числа така или иначе нямат смисъл? - person Atmocreations; 25.04.2016
comment
@Atmocreations: func Unix(sec int64, nsec int64) Time получава int64 стойности. Освен това отрицателните числа за секунди са напълно логични - те описват дати преди 1970 г.! :) Що се отнася до nsec, отрицателните стойности означават премахване на толкова много наносекунди от секундите. - person ANisus; 26.04.2016
comment
Искам само датата и часа като 2014-07-16 20:55:46 как може да се постигне това? - person karthik; 07.11.2016

Можете директно да използвате time.Unix функция за време, която преобразува unix времевия печат в 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)
}

Изход

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: https://play.golang.org/p/5FtRdnkxAd

person negi Yogi    schedule 06.12.2017
comment
time.Unix() е документиран да връща местното време. Следователно unixTimeUTC в този отговор не винаги предоставя часа в часовата зона UTC. Само когато местната часова зона съответства на UTC. - person Dr. Jan-Philip Gehrcke; 17.02.2021
comment
@Dr.Jan-PhilipGehrcke: Чудя се дали това в крайна сметка има значение. time.Unix() ще анализира времето във време в някаква часова зона (с информация за часовата зона). След това може да се използва повторно навсякъде (например конвертиране в даден TZ). Вярно е, че името на променливата може да не е щастливо в този случай. - person WoJ; 11.07.2021

Може би вашата редовна ssh сесия включва X пренасочване, а отдалечената сесия за отстраняване на грешки на python, която сте настроили, не го прави?
person Adi    schedule 14.12.2017
comment
Премахването на .In(loc) ми даде време в -0400 EDT. Замяната му с .In(time.UTC) ми даде време в UTC. - person NatoBoram; 16.07.2019

Според документацията за go Unix връща местно време.

Unix връща местното време, съответстващо на даденото Unix време

Това означава, че изходът ще зависи от машината, на която работи вашият код, което най-често е това, от което се нуждаете, но понякога може да искате да имате стойността в UTC.

За да направя това, адаптирах фрагмента, за да връща час в UTC:

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

Това се отпечатва на моята машина (в CEST)

2014-07-16 20:55:46 +0000 UTC
person Thib-o    schedule 24.09.2018

Правя много регистриране, когато клеймата са float64 и използвам тази функция, за да получа клеймата като низ:

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)
}
person Saxasmu    schedule 23.07.2020