Go言語でのUnixタイムスタンプの取得(エポックからの現在の時間(秒))


84

Goで記述されたコードがあり、最新の毎週のビルドで動作するように更新しようとしています。(最後にr60で構築されました)。次のビットを除いて、すべてが機能しています。

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

現在のGo実装で動作するようにこれを更新する方法に関するアドバイスはありますか?

回答:


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

41
ALERT:Unix()戻り値はタイプint64です。タイプint64値をタイプに切り捨てることint32は、2038年問題の例です。
peterSO 2017年

1
go1.9.2 darwin / amd64これは一貫して次を返します:1969-12-31 19:00:00、これはおおよそtime.Unix(0、0)と同等です。これは切り捨てなしです。
繁殖的に2018年

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(...)を実行するだけですか?
サルバドールダリ2016年

11
@SalvadorDali実際、これはまさに私が必要としていたものです。誰かが最終的にやって来てコードが必要になると確信している場合は、先に進んで答えを追加してバイト配列に変換してください。
anon58192932 2016年

3
time.Now()。UTC()。UnixNano()はtime.Now()。UnixNano()に置き換えることができます-ドキュメントには、結果はtに関連付けられた場所に依存しないと記載されています。
アブジュナイド2018年

16

別のヒント。 time.Now().UnixNano()(godoc)はエポックからナノ秒を与えます。厳密にはUnix時間ではありませんが、同じエポックを使用して1秒未満の精度が得られるため便利です。

編集:現在のgolangapiに一致するように変更されました


1
古いスレッドを復活させていることは知っていますが、疑問に思っています... Pythonは、さまざまなプラットフォームで正確な時刻を取得する際の問題を明確に文書化しています。docs.python.org/2/library/time.htmlを参照して、「精度」を検索してください。重要なのは、float64があるからではなく、すべての小数が重要であるということです。Goの時間はどのように実装されていますか、このナノ秒の精度をどれだけ信頼できますか?
ニリエル2013年

5
ここでは機能しませんが、time.Now().UnixNano()参照)は機能します。
Jo Liss 2013年

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 GoPlaygroundでお試しください。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.