Получение метки времени Unix на языке Go (текущее время в секундах с начала эпохи)


88

У меня есть код, написанный на Go, который я пытаюсь обновить для работы с последними еженедельными сборками. (Последний раз строился под r60). Теперь все работает, кроме следующего бита:

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

Есть какие-нибудь советы о том, как обновить это для работы с текущей реализацией Go?

Ответы:


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

44
ПРЕДУПРЕЖДЕНИЕ: 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
}

Какой в ​​этом смысл? Если кто-то хочет преобразовать число в строку, он может найти, как это сделать. Или, может быть, я должен просто добавить еще один ответ: если вы хотите преобразовать его в массив байтов, просто выполните [] byte (...)?
Сальвадор Дали,

12
@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. Как реализовано время Go, насколько я могу доверять этой наносекундной точности?
Нириэль

5
Здесь это не работает, но time.Now().UnixNano()( ссылка ) работает.
Jo Liss

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
}

Попробуйте это на игровой площадке Go .

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