Как разобрать временную метку unix на time.Time


126

Я пытаюсь разобрать временную метку Unix, но выхожу за пределы допустимого диапазона. Для меня это не имеет смысла, потому что макет правильный (как в документации Go):

package main

import "fmt"
import "time"

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

    fmt.Println(tm)
}

Игровая площадка

Ответы:


239

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-битных системах.


1
Есть идеи, почему в документах нет такой ссылки? Они даже приводят в качестве примера макет временной метки unix.
привет

Я предполагаю, что это потому, что временная метка unix не требует синтаксического анализа, так как это не текстовое представление, а целочисленное представление времени. Вы просто случайно получили строковое представление целочисленного значения. И упоминание 1136239445 в документации, вероятно, просто для того, чтобы прояснить, какая точная метка времени должна использоваться в качестве эталонного времени, а не для использования в качестве макета.
ANisus

4
Разве не лучше использовать strconv.ParseUintвместо этого, поскольку отрицательные числа в любом случае не имеют смысла?
Atmocreations

6
@Atmocreations: func Unix(sec int64, nsec int64) Timeполучает int64значения. Кроме того, отрицательные числа для секунд имеют смысл - они описывают даты до 1970 года! :) Что касается nsecотрицательных значений, значит убрать это количество наносекунд из секунд.
ANisus

1
Я хочу только дату и время в формате «2014-07-16 20:55:46», как это могло быть достигнуто?
karthik

14

Вы можете напрямую использовать функцию времени 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


4

Совместное использование нескольких функций, которые я создал для свиданий:

Обратите внимание, что я хотел узнать время для определенного места (а не только время UTC). Если вам нужно время в формате UTC, просто удалите переменную loc и вызов функции .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")
}

Удаление .In(loc)дало мне время -0400 EDT. Замена на .In(time.UTC)дала мне время в UTC.
NatoBoram

3

Согласно документации 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

0

Я много веду журналы, где метки времени - 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)
}

-6

Просто используйте время.

пример:

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 .


2
В вопросе указывается временная метка unix. Этот ответ не касается этого аспекта.
t3h2mas
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.