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

編集:

32ビットシステムでのintオーバーフローを回避するためにからstrconv.Atoiに変更されましstrconv.ParseIntた。


1
ドキュメントにそのような参照がない理由は何ですか?レイアウトの例として、UNIXタイムスタンプレイアウトも提供しています。
ちょっと

Unixタイムスタンプはテキスト表現ではなく、時間の整数表現であるため、解析が不要なためだと思います。あなたはたまたま整数値の文字列表現を持っています。また、ドキュメントで1136239445について言及しているのは、基準時間として使用する正確なタイムスタンプを明確にするためだけであり、レイアウトとして使用するためではありません。
ANisus 14

4
strconv.ParseUintとにかく負の数は意味をなさないので、代わりに使用した方がいいのではないでしょうか?
2016

6
@Atmocreations:値func Unix(sec int64, nsec int64) Timeを受け取りint64ます。また、秒の負の数は完全に理にかなっています-1970年より前の日付を表します!:)についてはnsec、負の値は秒からその数ナノ秒を取り除くことを意味します。
ANisus

1
「2014-07-16 20:55:46」のように日付と時刻のみを取得したいのですが、どうすれば達成できますか?
karthik 2016年

14

unixタイムスタンプをUTCに変換するtime.Unix関数を直接使用できます。

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