Отримання мітки часу Unix мовою Go (поточний час у секундах з епохи)


85

У мене в Go написаний код, який я намагаюся оновити, щоб працювати з останніми щотижневими збірками. (Востаннє він був побудований під r60). Зараз все працює, крім наступного біта:

 if t, _, err := os.Time(); err == nil {
   port[5] = int32(t)
 }

Будь-яка порада щодо того, як оновити це для роботи з поточною реалізацією Go?

Відповіді:


167
import "time"
...
port[5] = int32(time.Now().Unix())

41
ПОВІДОМЛЕННЯ: Unix()Повернене значення має тип int64. Зрізання int64значення типу до типу int32є прикладом проблеми 2038 року .
peterSO

1
go1.9.2 darwin / amd64 це послідовно повертає: 1969-12-31 19:00:00, що приблизно еквівалентно: time.Unix (0, 0). Це без усічення.
Breedly

31

Якщо ви хочете, щоб stringпросто перетворити його за допомогою strconv:

package main

import (
    "fmt"
    "strconv"
    "time"
)

func main() {
    timestamp := strconv.FormatInt(time.Now().UTC().UnixNano(), 10)
    fmt.Println(timestamp) // prints: 1436773875771421417
}

Який сенс у цьому? Якщо хтось хоче перетворити число в рядок, він може знайти, як це зробити. А може бути, я повинен просто додати ще одну відповідь: якщо ви хочете перетворити його в байтовий масив, просто зробіть [] байт (...)?
Сальвадор Далі

11
@SalvadorDali Насправді це саме те, що мені потрібно. Вперед і додайте свою відповідь, щоб перетворити її в байтовий масив, якщо хочете, я впевнений, що хтось зрештою прийде і потребує коду.
anon58192932

3
time.Now (). UTC (). UnixNano () можна замінити time.Now (). UnixNano () - документ говорить, що результат не залежить від розташування, пов'язаного з t.
Абу Джунейд

16

Ще одна порада. time.Now().UnixNano()(godoc) дасть вам наносекунди з епохи. Це не суто час Unix, але він надає точність до секунди, використовуючи ту саму епоху, що може бути зручним.

Редагувати: змінено відповідно до поточного API golang


1
Я знаю, що відроджую стару нитку, але мені цікаво ... Python чітко документує проблеми, які виникають із отриманням точного часу на різних платформах. Див. Docs.python.org/2/library/time.html і знайдіть "точність". Справа в тому, що не тому, що у вас є float64, всі десяткові знаки є значущими. Як реалізується час Го, наскільки я можу довіряти цій наносекундній точності?
Ніріель

5
Тут це не працює, але time.Now().UnixNano()( посилання ) працює.
Джо Лісс

0

Спираючись на ідею іншої відповіді тут, щоб отримати зрозумілу для людини інтерпретацію, ви можете використовувати:

package main

import (
    "fmt"
    "time"
)

func main() {
    timestamp := time.Unix(time.Now().Unix(), 0)
    fmt.Printf("%v", timestamp) // prints: 2009-11-10 23:00:00 +0000 UTC
}

Спробуйте на майданчику The Go .

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.