Як розібрати часові позначки unix до часу


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
Будь-яка ідея, чому в документах немає такого посилання? Вони навіть наводять макет timexta unix як приклад макета.
ей,

Я думаю, це тому, що часова марка unix не вимагає розбору, оскільки це не текстове подання, а скоріше ціле подання часу. У вас просто трапилося подання рядка цілого значення. І згадка про 1136239445 в документах, мабуть, просто для уточнення, яка точна мітка часу повинна використовуватися як опорний час, а не те, що вона повинна використовуватися як макет.
Анісус

4
Чи не було б краще використовувати strconv.ParseUintнатомість, оскільки негативні цифри все одно не мають сенсу?
Амокреації

6
@Atmocreations: func Unix(sec int64, nsec int64) Timeотримує int64значення. Крім того, від’ємні цифри за секунду мають ідеальний сенс - вони описують дати до 1970 року! :) Щодо nsecнегативних значень означає зняти стільки наносекунд із секунд.
Анісус

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


4

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

Зауважте, що я хотів отримати час для певного місця (не лише UTC). Якщо вам потрібен час UTC, просто видаліть змінну локального зв’язку та виклик функції .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

Я роблю багато журналів, де часові позначки плавають64 і використовую цю функцію, щоб отримати часові позначки як рядкові:

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.